Given preorder and inorder 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> &preorder, vector<int> &inorder) { 13 // Start typing your C/C++ solution below 14 // DO NOT write int main() function 15 return makeTree(0,inorder.size()-1,0,preorder.size()-1,&inorder,&preorder); 16 } 17 TreeNode *makeTree(int l1,int r1,int l2,int r2,vector<int> *inorder , vector<int> *preorder) 18 { 19 if(l1 > r1) 20 return NULL; 21 TreeNode * root; 22 if(l1 == r1) 23 { 24 root = new TreeNode(preorder->at(l2)); 25 return root; 26 } 27 root = new TreeNode(preorder->at(l2)); 28 int pos = l1; 29 while(inorder->at(pos) != preorder->at(l2)) 30 pos++; 31 if(pos - 1 - l1 >= 0) 32 root->left = makeTree(l1,pos - 1,l2 + 1,l2 + pos - l1,inorder,preorder); 33 if(r1 - pos - 1 >= 0) 34 root->right = makeTree(pos + 1,r1,r2 - r1 + pos + 1,r2,inorder,preorder); 35 return root; 36 } 37 };

浙公网安备 33010602011771号