Given inorder and postorder traversal of a tree, construct the binary tree.
Note:
You may assume that duplicates do not exist in the tree.
首先,后序周游序列的最后一个元素是根节点。那么需要在中序周游序列中找到这个元素的下标,这样就可以将两个序列分别分割开,用同样的方法找根节点的左右子节点。
1 /** 2 * Definition for binary tree 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(int x) : val(x), left(NULL), right(NULL) {} 8 * }; 9 */ 10 class Solution { 11 public: 12 TreeNode *buildTree(vector<int> &inorder, vector<int> &postorder) { 13 // Start typing your C/C++ solution below 14 // DO NOT write int main() function 15 return makeTree(0,inorder.size()-1,0,inorder.size()-1,&inorder,&postorder); 16 } 17 TreeNode *makeTree(int l1,int r1,int l2,int r2,vector<int> *inorder , vector<int> *postorder) 18 { 19 if(l1 > r1) 20 return NULL; 21 TreeNode * root; 22 if(l1 == r1) 23 { 24 root = new TreeNode(postorder->at(r2)); 25 return root; 26 } 27 root = new TreeNode(postorder->at(r2)); 28 int pos = l1; 29 while(inorder->at(pos) != postorder->at(r2)) 30 pos++; 31 if(pos - 1 - l1 >= 0) 32 root->left = makeTree(l1,pos - 1,l2,l2 + pos -1 - l1,inorder,postorder); 33 if(r1 - pos - 1 >= 0) 34 root->right = makeTree(pos + 1,r1,r2 - r1 + pos,r2 - 1,inorder,postorder); 35 return root; 36 } 37 };

浙公网安备 33010602011771号