Given preorder and inorder traversal of a tree, construct the binary tree.
Note:
You may assume that duplicates do not exist in the tree.
和前一题类似
/**
* 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 *help(vector<int> &preorder, int a, int b,vector<int> &inorder,int c , int d){
int len = b-a+1;
if(len==0)
return NULL;
if(len==1)
{
TreeNode *p = new TreeNode(preorder[a]);
return p;
}
//左根右
//根左右
int root = preorder[a];
TreeNode *p = new TreeNode( root);
int site;
for(int i = c ; i <= d ; i++)
if (inorder[i]==root)
{
site = i;
break;
}
int left_len = site - c;
int right_len = len - left_len -1;
if(left_len > 0)
p->left = help(preorder,a+1,a+left_len,inorder,c, c + left_len-1);
if(right_len > 0)
p->right = help(preorder,a+left_len+1, b,inorder,site+1, d);
return p;
}
TreeNode *buildTree(vector<int> &preorder, vector<int> &inorder) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
size_t len = inorder.size();
if(len == 0)
return NULL;
TreeNode *p = help(preorder,0,len-1,inorder,0,len-1);
return p;
}
};