[剑指offer]重建二叉树
题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
例如,给出
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
3
/ \
9 20
/ \
15 7
限制:
0 <= 节点个数 <= 5000
解题思路
前序遍历第一个值为根节点的值,在中序遍历中找到这个值的位置lo,将中序遍历结果分为两部分,前半部分为左子树的中序遍历,后半部分为右子树的中序遍历,并且利用lo获得左子树的前序遍历和右子树的前序遍历,然后分别利用左右子树进行递归。
代码实现
class Solution {
public:
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
if(preorder.empty()&&inorder.empty())
return NULL;
TreeNode *head = new TreeNode(preorder[0]);
int lo=0;
for(lo=0;lo<inorder.size();lo++){
if(inorder[lo]==preorder[0])
break;
}
vector<int> preL;
vector<int> preR;
vector<int> inL;
vector<int> inR;
preL.assign(preorder.begin()+1,preorder.begin()+1+lo);
preR.assign(preorder.begin()+1+lo,preorder.end());
inL.assign(inorder.begin(),inorder.begin()+lo);
inR.assign(inorder.begin()+lo+1,inorder.end());
head->left = buildTree(preL,inL);
head->right = buildTree(preR,inR);
return head;
}
};