在网上找了很久发现能写清楚的很少。,命名风格让人真的很难理解。
参考了大神的代码 原地址大神代码
//已知层序和中序还原二叉树
vector <int>layer; //层序遍历结果
vector<int> leftlayer;
vector <int> rightlayer;
//in【iL,iR】中序遍历结果
node *creat(vector<int>layer,int iL,int iR)
{
if(iL>iR)
{
return NULL;
}
// if(layer.size() == 0)
// {
// return NULL;
// }
node *root=new node; //新建一个新的结点,用来存放当前二叉树的根结点
root->data=layer[0]; //新结点的数据域为根结点的值
int k; //去确定根结点在层序遍历中的位置,用于区分左右子树
for(k=iL ; k <=iR ; k++ )
{
if(in[k]==layer[0])
{
break;
}
}
vector<int> leftlayer;
vector <int> rightlayer;
//把左右子树给分别放到leftlayer和rightlayer中去递归
for(int i=1;i<layer.size();i++)
{
bool isLeft = false;
for(int j = iL ; j<k;j++)
{
if(layer[i]==in[j])
{
isLeft=true;
break
}
}
if(isLeft==true)
leftlayer.push_back(layer[i]);
else
rightlayer.push_back(layer[i]);
isLeft=false;
}
root->lchild =creat(leftlayer,iL,k-1); //左子树递归
root->rchild =creat(rightlayer,k+1,iR);//右子树递归
return root; //返回根节点的地址
}