1 题目
Given preorder and inorder traversal of a tree, construct the binary tree.
Note:
You may assume that duplicates do not exist in the tree.
For example, given
preorder = [3,9,20,15,7]
inorder = [9,3,15,20,7]
Return the following binary tree:
3
/ \
9 20
/ \
15 7
2 尝试解
class Solution {
public:
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
if(preorder.size() == 0) return NULL;
TreeNode* root = new TreeNode(preorder[0]); //the last node in preorder is root, e.g. 3
int root_index = 0;
while(inorder[root_index]!=root->val){root_index++;}
//the root node of inorder vector split the group, the left subtree and the right subtree
vector<int> in_left,in_right,pre_left,pre_right;
in_left.assign(inorder.begin(),inorder.begin()+root_index);
in_right.assign(inorder.begin()+root_index+1,inorder.end());
pre_left.assign(preorder.begin()+1,preorder.begin()+root_index+1);
pre_right.assign(preorder.begin()+root_index+1,preorder.end());
root->left = buildTree(pre_left,in_left);
root->right = buildTree(pre_right,in_right);
return root;
}
};
3 标准解
TreeNode *buildTree(vector<int> &preorder, vector<int> &inorder) {
return create(preorder, inorder, 0, preorder.size() - 1, 0, inorder.size() - 1);
}
TreeNode* create(vector<int>& preorder, vector<int>& inorder, int ps, int pe, int is, int ie){
if(ps > pe){
return nullptr;
}
TreeNode* node = new TreeNode(preorder[ps]);
int pos;
for(int i = is; i <= ie; i++){
if(inorder[i] == node->val){
pos = i;
break;
}
}
node->left = create(preorder, inorder, ps + 1, ps + pos - is, is, pos - 1);
node->right = create(preorder, inorder, pe - ie + pos + 1, pe, pos + 1, ie);
return node;
}