先+后序给出的序列,在什么情况下组成的二叉树序列不唯一?
答:某一子树长度为0时。
用先序举例
因为正常划分 根|左|右
当某一子树长度为0,那么 多种划分方式 ()|左|右,根|()|右,根|左|();
两点和(先+中转后 后+中转先)不同:
1.当 发现子树长0,可判定不唯一,f=0;
2. 当l==r时,说明只有一点,push之后就return 。
#include<bits/stdc++.h>
using namespace std;
int n=0,f=1;
vector<int> pre,in,post;
void dfs(int l,int r,int l1,int r1){
if(l==r){
in.push_back(pre[l]);
return ;
}
if(pre[l]==post[r1]){
int i=l+1;
while(i<r && pre[i]!=post[r1-1]) i++;
if(i-l>1){
dfs(l+1,i-1,l1,l1+(i-l-1)-1);
}
else
f=0;
in.push_back(post[r1]);
dfs(i,r,l1+(i-l-1),r1-1);
}
}
int main(){
cin>>n;
for(int i=0;i<n;i++){
int x;
cin>>x;
pre.push_back(x);
}
for(int i=0;i<n;i++){
int x;
cin>>x;
post.push_back(x);
}
dfs(0,n-1,0,n-1);
f==1?printf("Yes\n"):printf("No\n");
for(int i=0;i<n;i++){
if(i!=0)
printf(" ");
printf("%d",in[i]);
}
printf("\n");
return 0;
}