#include<iostream>
#include<vector>
using namespace std;
vector<int> in,pre,post;
int a;
bool unique=true;
int n;
//需要四个变量确定范围
void getin(int prel,int postl,int postr)
{ //段错误可能使边界写的不对 (注意)
if(postl>=postr){
if(postl==postr)
in.push_back(post[postr]);
return;
}
int i=postl;
while(i<postr&&post[i]!=pre[prel+1])i++;
if(postr-i>1)
{
getin(prel+1,postl,i);
in.push_back(pre[prel]);
getin(prel+i-postl+2,i+1,postr-1);
}
else
{
unique=false;
getin(prel+1,postl,i);
in.push_back(pre[prel]);
getin(prel+i-postl+2,i+1,postr-1);
}
}
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)
{cin>>a;
pre.push_back(a);
}
for(int i=0;i<n;i++)
{cin>>a;
post.push_back(a);
}
getin(0,0,n-1);
//irst printf in a line Yes if the tree is unique, or No if not.
unique==true?printf("Yes\n"):printf("No\n");
printf("%d",in[0]);
for(int i=1;i<n;i++)
printf(" %d",in[i]);
printf("\n");
return 0;
}
总结:
1.段错误可能使递归边界没有写好
2.vector输入pushback是从尾部输入,如果前面用了resize 那前面都会是0导致错误
即用resize后只能用序号输入,不能用pushback
如果用pushback那需要先借中间值一个再用pushback
3.左右分匀,如果从后序中找先序元素则一定是左子树那边的分的时候要包括在左子树那边
如果是从先序中找后续元素则此元素一定是在右子树那边的 递归遍历右子树时要囊括
4.格式不对试着价格换行
不行了我要去睡觉了大家晚安~
英语: