要求:根据前序遍历和中序遍历重建一棵二叉树
主要编程思想:由于前序遍历第一个数永远是根,中序遍历根左边是左子树,右边卫右子树。因此,每次找到一个根节点,前序遍历就可以分成左子树序列和右子树序列,中序遍历也可以分成左子树序列和右子树序列,分别创建左子树和右子树,所以是非常典型的递归问题
TreeNode* rebuildTree(vector<int>& pre,int a1,int b1,vector<int>& vin,int a2,int b2)
{
TreeNode* root = new TreeNode(pre[a1]);
int i = a2;
while(vin[i] != pre[a1])
i++;
int left = i-a2;//左子树长度
int right = b2-i;//右子树长度
if(left>0)
root->left = rebuildTree(pre,a1+1,a1+left, vin,a2, i-1);//根据左子树前序和中序创建左子树
if(right>0)
root->right = rebuildTree(pre,a1+left+1, b1, vin,i+1, b2);//根据右子树前序和中序创建右子树
return root;
}
TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin)
{
if(pre.size() != vin.size() || vin.size() <= 0)
return nullptr;
return rebuildTree(pre,0,pre.size()-1,vin,0,vin.size()-1);
}