根据一棵树的前序遍历与中序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。
例如,给出
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
3
/ \
9 20
/ \
15 7
思路:了解先根遍历和中根遍历的特点。每次在先根遍历数组中最左边的就是二叉树的根,然后去中根遍历数组中找到根,根左边的就是左子树,根右边的就是右子树。对于左子树和右子树采取同样的求法:去先根遍历数组中找根,利用中根遍历数组划分左右子树,递归求解。
class Solution {
public:
TreeNode* dfs(vector<int>& preorder, int l1, int r1, vector<int>& inorder, int l2, int r2){
if(l1>r1) return nullptr;
TreeNode *root=new TreeNode(preorder[l1]);
for(int i=l2; i<=r2; ++i){
if(inorder[i]==preorder[l1]){
root->left=dfs(preorder, l1+1, l1+i-l2, inorder, l2, i-1);
root->right=dfs(preorder, l1+i-l2+1, r1, inorder, i+1, r2);
break;
}
}
return root;
}
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
return dfs(preorder, 0, preorder.size()-1, inorder, 0, preorder.size()-1);
}
};