Given preorder and inorder traversal of a tree, construct the binary tree.
Notice
You may assume that duplicates do not exist in the tree.
Example
Given in-order [1,2,3]
and pre-order [2,1,3]
, return a tree:
2
/ \
1 3
/**
* Definition of TreeNode:
* class TreeNode {
* public:
* int val;
* TreeNode *left, *right;
* TreeNode(int val) {
* this->val = val;
* this->left = this->right = NULL;
* }
* }
*/
class Solution {
/**
*@param preorder : A list of integers that preorder traversal of a tree
*@param inorder : A list of integers that inorder traversal of a tree
*@return : Root of a tree
*/
private:
TreeNode *buildTreeHelper(vector<int> &preorder, int start1, int end1, vector<int> &inorder, int start2, int end2) {
if (end1 < start1 || end2 < start2)
return NULL;
TreeNode *root = new TreeNode(preorder[start1]);
int rootIdx = start2;
int offset = 0; //这个offset的概念很重要
for (; rootIdx <= end2; rootIdx++)
{
if (inorder[rootIdx] == preorder[start1])
break;
offset++;
}
//start1+rootIdx是错误的,对于左边来说,应该是start1+offset;
root->left = buildTreeHelper(preorder, start1+1, start1+offset, inorder, start2, rootIdx-1);
root->right = buildTreeHelper(preorder, start1+offset+1, end1, inorder, rootIdx+1, end2);
return root;
}
public:
TreeNode *buildTree(vector<int> &preorder, vector<int> &inorder) {
// write your code here
return buildTreeHelper(preorder, 0, preorder.size()-1, inorder, 0, inorder.size()-1);
}
};