Problem
Given preorder and inorder traversal of a tree, construct the binary tree.
Example
For example, given
preorder = [3,9,20,15,7]
inorder = [9,3,15,20,7]
return the following binary tree
Solution
前序遍历的第一个元素就是整棵树的根。
在中序遍历序列中,位于根元素左侧的就是左子树的前序遍历序列,根元素右侧的就是右子树的前序遍历序列。
根据中序遍历,得到左右子树各自的元素个数,然后从整棵树的前序遍历先取出左子树的前序遍历序列,再取出右子树的前序遍历序列。
这样就可以递归构建左右子树了。
注意stl算法find,copy和back_inserter的使用。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
if(preorder.empty())
return NULL;
TreeNode *root = new TreeNode(preorder[0]);
vector<int>::iterator it;
it = find (inorder.begin(), inorder.end(), preorder[0]);
vector<int> left_inorder;
vector<int> right_inorder;
copy(inorder.begin(),it,back_inserter(left_inorder));
copy(++it,inorder.end(),back_inserter(right_inorder));
vector<int> left_preorder;
vector<int> right_preorder;
copy(preorder.begin()+1,preorder.begin()+1 + left_inorder.size(),back_inserter(left_preorder));
copy(preorder.begin()+1 + left_inorder.size(),preorder.end(),back_inserter(right_preorder));
root->left = buildTree(left_preorder,left_inorder);
root->right = buildTree(right_preorder,right_inorder);
return root;
}
};