CoderJesse  
wangjiexi@CS.PKU

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 };

 

posted on 2013-03-01 13:20  CoderJesse  阅读(125)  评论(0)    收藏  举报