0
点赞
收藏
分享

微信扫一扫

先序遍历,中序遍历:最后层次右到左输出。

慕犹清 2022-08-22 阅读 30


先序遍历:根左右

中序遍历:左根右

后序遍历:左右根

给出先序遍历和中序遍历,从右到左层次输出

指针版本:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
int pre_n[50];
int in_n[50];
int n;
struct Node
{
int id;
Node *lefted,*righted;
Node(){
id=0;
lefted=NULL;
righted=NULL;
}
};
Node *Root;
Node *build(int L1,int R1,int L2,int R2)//前序找根,中序分割建树
{
if(L2>R2) return NULL;
Node *root;
root=new Node();
root->id=pre_n[L1];
int p=L2;
while(in_n[p]!=root->id) p++;
int cnt=p-L2;
root->lefted=build(L1+1,L1+cnt,L2,p-1);
root->righted=build(L1+cnt+1,R1,p+1,R2);
return root;
}
int ans[55],cnt;
void select_post(Node *tree)
{
queue<Node> q;
if(tree) q.push(*tree);
while(!q.empty()){
Node tmp=q.front();q.pop();
ans[cnt++]=tmp.id;
if(tmp.righted) q.push(*tmp.righted);
if(tmp.lefted) q.push(*tmp.lefted);
}

}
int main()
{
cin>>n;
for(int i=0;i<n;i++) cin>>in_n[i];//中序
for(int i=0;i<n;i++) cin>>pre_n[i];//前
Root=build(0,n-1,0,n-1);
//cout<<Root.id;
cnt=0;
select_post(Root);
cout<<ans[0];
for(int i=1;i<cnt;i++){
cout<<" "<<ans[i];
}
cout<<endl;
return 0;
}

数组版本:

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
int lef[55],rig[55];
int pre[55],in[55];
int ans[55];
int p;
int dfs(int l,int r){
if(l>r) return -1;
int t=pre[p];
p++;
int cnt=0;
for(int i=l;i<=r;i++){
if(t==in[i]){
cnt=i;
break;
}
}
lef[t]=dfs(l,cnt-1);
rig[t]=dfs(cnt+1,r);
return t;
}
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++) cin>>pre[i];
for(int i=0;i<n;i++) cin>>in[i];
p=0;
int root=dfs(0,n-1);
int cnt=0;
queue<int> q;
q.push(root);
while(!q.empty()){
int u=q.front();q.pop();
if(u==-1) continue;
ans[cnt++]=u;
q.push(rig[u]);
q.push(lef[u]);
}
cout<<ans[0];
for(int i=1;i<cnt;i++) cout<<" "<<ans[i];
return 0;
}

 

举报

相关推荐

0 条评论