输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
思路:递归
前序遍历的当前为是根,在中序遍历中找这个根,根的位置将树分为左子树和右子树
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution
{
private:
TreeNode* reConstructBinaryTree(const vector<int> &pre, int preFrom,
const vector<int> &vin, int vinFrom,
int len)
{
if(0 == len)
{
return 0;
}
TreeNode *root= new TreeNode(pre[preFrom]);
if(1 == len)
{
return root;
}
int rootValue= pre[preFrom];
int vinPos= -1;
for(int i= vinFrom; i< vinFrom+len; ++i)
{
if(rootValue == vin[i])
{
vinPos= i;
break;
}
}
if(-1 == vinPos)
{
return 0;
}
int leftLen= vinPos- vinFrom;
int rightLen= len- leftLen- 1;
root->left= reConstructBinaryTree(pre, preFrom+1,
vin, vinFrom,
leftLen);
root->right= reConstructBinaryTree(pre, leftLen+preFrom+1,
vin, vinPos+1,
rightLen);
return root;
}
public:
TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin)
{
int preLen= pre.size();
int vinLen= vin.size();
if(preLen== 0 || vinLen == 0 || preLen!= vinLen)
{
return 0;
}
return reConstructBinaryTree(pre, 0, vin, 0, preLen);
}
};