1.已知中+先(后) 求 层序;
PTA 1020,1127;
我一开始用柳神的map+index做,但是这样不能从根本解决问题,因为这样的层序是通过map自动排序的结果,并不能真正的知道每一层的节点情况,如果用这种方法那1127就做不出来。所以我换了一种。
采用二维数组,深度作为index,存每个节点的值。这样就可以随心所欲的打印各种层序的变种问题了。注意二维数组里面的那一维存的节点 一定 是从左之右的。
PTA1020
#include<bits/stdc++.h>
using namespace std;
int n,ma=0;
vector<int> in,post;
vector<int> ans[40];
void dfs(int root,int l,int r,int deep){
if(l>r)
return ;
int i=0;
ma=max(ma,deep);
ans[deep].push_back(post[root]); //一定从左至右,因为你是先递归左子树,再右子树。
while(i<r && in[i]!=post[root]) i++;
dfs(root-(r-i)-1,l,i-1,deep+1);
dfs(root-1,i+1,r,deep+1);
}
int main(){
cin>>n;
for(int i=0;i<n;i++){
int x;
cin>>x;
post.push_back(x);
}
for(int i=0;i<n;i++){
int x;
cin>>x;
in.push_back(x);
}
dfs(n-1,0,n-1,0);
cout<<ans[0][0];
for(int i=1;i<=ma;i++){
for(auto j:ans[i])
cout<<" "<<j;
}
return 0;
}
2.中+后(先)序 求 先(后)序 ?
就中+先举例吧。怎么求后序? 模板题目,不难理解
PTA1086
void dfs(int root,int l,int r){
if(l>r)
return ;
int i=0;
while(i<r && in[i]!=pre[root]) i++;
dfs(root+1,l,i-1); //三个参数,第一个是针对pre的,后两个是针对in的
dfs(root+(i-l)+1,i+1,r);
post.push_back(pre[root]);
}
3.先序+后序 判断中序?
先序+后序得出的二叉树不一定唯一,怎么判断二叉树是不是唯一呢?
PTA1119
答:如果上述找子树遍历过程中发现子树长度为0,判断不唯一。
详细描述:添加链接描述
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);
}
}