根据一棵树的前序遍历与中序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。
例如,给出
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
3
/ \
9 20
/ \
15 7
递归:
reBuild的参数解释一下,start表示preorder数组的开始下标,l和r表示在inorder数组中遍历范围的下标。
总体思想就是先在先序遍历数组中首先找到根节点,然后在中序遍历数组中找到数值跟之前根节点一样的元素,因为所有元素都是互异的,所以中序遍历数组中的这个元素就是树的根节点,这个元素左边的元素就是左子树,右边的元素就是右子树,然后就可以得到左右子树的长度,然后计算reBuild函数新的参数,递归下去就可以了。
class Solution {
public:
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
if (preorder.size()==0) return NULL;
return reBuild(preorder, inorder, 0, 0, preorder.size());
}
TreeNode* reBuild(vector<int>& preorder, vector<int>& inorder, int start, int l, int r) {
int root_val = preorder[start];
TreeNode* root = new TreeNode(root_val);
int mid=l;
for (int i=l; i<r; ++i) {
if (inorder[i]==root_val) {
mid = i;
break;
}
}
int leftLen = mid - l;
int rightLen = r - mid-1;
if(leftLen>0) {
root->left = reBuild(preorder, inorder, start+1, l, mid);
}
if (rightLen>0) {
root->right = reBuild(preorder, inorder, start+leftLen+1, mid+1, r);
}
return root;
}
};