Construct Binary Tree from Inorder and Preorder(Postorder) Traversal

来源:互联网 发布:start法则知乎 编辑:程序博客网 时间:2024/06/07 13:21

通过前序中序序列构造二叉树以及通过后序中序序列构造二叉树。

用递归,每次通过寻找根节点,改变peorder和inorder的起止位置,实现递归。

前序中序序列构造二叉树代码:

/** * Definition for binary tree * struct TreeNode { *     int val; *     TreeNode *left; *     TreeNode *right; *     TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public:    TreeNode *buildTree(vector<int> &preorder, vector<int> &inorder) {        if(preorder.size()==0||inorder.size()==0){            return NULL;        }        if(preorder.size()==1||inorder.size()==1){            return new TreeNode(preorder[0]);        }        return buildTree(preorder,0,preorder.size()-1,inorder,0,preorder.size()-1);    }        TreeNode *buildTree(vector<int> &preorder,int preL,int preR,vector<int> &inorder,int inL,int inR){        int mid=0;        for(mid=inL;mid<=inR;mid++){            if(inorder[mid]==preorder[preL]){                break;            }        }        if(preL>preR||inL>inR){            return NULL;        }        TreeNode *root=new TreeNode(preorder[preL]);        TreeNode *left=buildTree(preorder,preL+1,preL+mid-inL,inorder,inL,mid-1);        TreeNode *right=buildTree(preorder,preL+mid-inL+1,preR,inorder,mid+1,inR);        root->left=left;        root->right=right;        return root;    }};
后序中序序列构造二叉树代码:

/** * Definition for binary tree * struct TreeNode { *     int val; *     TreeNode *left; *     TreeNode *right; *     TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public:    TreeNode *buildTree(vector<int> &inorder, vector<int> &postorder) {        if(postorder.size()==0||inorder.size()==0){            return NULL;        }        if(postorder.size()==1||inorder.size()==1){            return new TreeNode(postorder[inorder.size()-1]);        }        return buildTree(postorder,0,postorder.size()-1,inorder,0,inorder.size()-1);    }    TreeNode *buildTree(vector<int> &postorder,int posL,int posR,vector<int> &inorder,int inL,int inR){        int mid=0;        for(mid=inL;mid<=inR;mid++){            if(inorder[mid]==postorder[posR]){                break;            }        }        if(posL>posR||inL>inR){            return NULL;        }        TreeNode *root=new TreeNode(postorder[posR]);        TreeNode *left=buildTree(postorder,posL,posL+mid-inL-1,inorder,inL,mid-1);        TreeNode *right=buildTree(postorder,posL+mid-inL,posR-1,inorder,mid+1,inR);        root->left=left;        root->right=right;        return root;    }};



0 0
原创粉丝点击