Construct Binary Tree from Inorder and Postorder Traversal
Given inorder and postorder traversal of a tree, construct the binary tree.
Note:
You may assume that duplicates do not exist in the tree.
思路:从中序遍历和后序遍历的数组中找到唯一的二叉树。首先找到根结点,后序遍历最末位是根结点,然后找出中序遍历根结点的位置,记录index,且计算左子树的长度。递归方法,在左子树和右子树的遍历数组中再找出左子树和右子树的根结点,以此类推。
/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: void buildBST(TreeNode *&root,vector<int> &inorder,int inBegin,int inEnd,vector<int> &postorder,int postBegin,int postEnd) { if(inBegin>inEnd || postBegin>postEnd) return; int pRoot=postorder[postEnd]; root=new TreeNode(pRoot); int index=0; for(int i=0;i<=inEnd;i++) { if(pRoot==inorder[i]) { index=i; break; } } int in_len=index-inBegin; buildBST(root->left,inorder,inBegin,index-1,postorder,postBegin,postBegin+in_len-1); buildBST(root->right,inorder,index+1,inEnd,postorder,postBegin+in_len,postEnd-1); } TreeNode *buildTree(vector<int> &inorder, vector<int> &postorder) { TreeNode *root; if(inorder.empty() || postorder.empty()) return NULL; int inEnd=inorder.size()-1; int postEnd=postorder.size()-1; buildBST(root,inorder,0,inEnd,postorder,0,postEnd); return root; } };