条件 知道前序遍历和中序遍历;求出此二叉树; 函数原型为:
TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin)
思路:
- 先考虑特殊情况 不合法输入的时候 或者只有一个结点的时候
- 递归方法;求出根节点的左右子节点;
- 递归出两个子函数 所以需要四个数组;前序遍历的 左右子树;中序遍历的左右子树数组
TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> in)
{
int length=pre.size();
if(length==0)
return nullptr;
TreeNode* pRoot=new TreeNode(pre[0]);//创建根节点并进行初始化;必须初始化哟
//pRoot->val=pre[0];
pRoot->left=pRoot->right=nullptr;
//此时只有一个结点
if(pre[0]==pre[length-1])
{
if(pre[0]==in[0]&&in[0]==in[length-1])
return pRoot;
else
return nullptr;
}
//从中序遍历中找到根节点位置,并记录下来 pos_root_of_in;
int pos_root_of_in=0;
while(in[pos_root_of_in]!=pre[0])
++pos_root_of_in;
vector<int >pre_left,pre_right,in_left,in_right;//左右子树的前序遍历数列与中序遍历数列;
//左子树的确定(前序的范围:前序从第一位,到pos_root-of-in位);
for(int i=0;i<pos_root_of_in;++i)
{
in_left.push_back(in[i]);
pre_left.push_back(pre[i+1]);
}
//右子树的确定(范围从根节点的下一位到终点)
for(int i=pos_root_of_in+1;i<length;i++)
{
in_right.push_back(in[i]);
pre_right.push_back(pre[i]);
}
//递归对左右子树的重建;最后就是对整个树的重建;
pRoot->left=reConstructBinaryTree(pre_left,in_left);
pRoot->right=reConstructBinaryTree(pre_right,in_right);
return pRoot;
}