1020 Tree Traversals (25 分)(树知二求一)

---恢复内容开始---

题意:

输入一个正整数N(N<=30),给出一棵二叉树的后序遍历和中序遍历,输出它的层次遍历。

trick:

当30个点构成一条单链时,如代码开头处的数据,大约1e9左右的结点编号大小,故采用结构体储存结点的序号(1~N),编号(代表它在完全二叉树上的位置)和值。PTA网站上可以用大小为31的数组存放结点,可能数据为一颗比较平衡的二叉树。

代码:

/*
30
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
*/

#include<bits/stdc++.h>
using namespace std;
int pos[37],in[37];
typedef struct lv{
int cnt,index,num;
};
lv level[37];
int cnt=0;
void find_(int iroot,int istart,int iend,int index){
if(istart>iend)
return;
level[++cnt].index=index;
level[cnt].num=pos[iroot];
int i=istart;
while(in[i]!=pos[iroot])
++i;
find_(iroot-1-iend+i,istart,i-1,2*index+1);
find_(iroot-1,i+1,iend,2*index+2);
}
bool cmp(lv a,lv b){
if(a.index!=b.index)
return a.index<b.index;
}
int main(){
int n;
cin>>n;
for(int i=0;i<n;++i)
cin>>pos[i];
for(int i=0;i<n;++i)
cin>>in[i];
find_(n-1,0,n-1,0);
sort(level+1,level+1+n,cmp);
for(int i=1;i<cnt;++i)
cout<<level[i].num<<" ";
cout<<level[cnt].num;
return 0;
}

---恢复内容结束---

题意:

输入一个正整数N(N<=30),给出一棵二叉树的后序遍历和中序遍历,输出它的层次遍历。

trick:

当30个点构成一条单链时,如代码开头处的数据,大约1e9左右的结点编号大小,故采用结构体储存结点的序号(1~N),编号(代表它在完全二叉树上的位置)和值。【

代码:

/*
30
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
*/

#include<bits/stdc++.h>
using namespace std;
int pos[37],in[37];
typedef struct lv{
int cnt,index,num;
};
lv level[37];
int cnt=0;
void find_(int iroot,int istart,int iend,int index){
if(istart>iend)
return;
level[++cnt].index=index;
level[cnt].num=pos[iroot];
int i=istart;
while(in[i]!=pos[iroot])
++i;
find_(iroot-1-iend+i,istart,i-1,2*index+1);
find_(iroot-1,i+1,iend,2*index+2);
}
bool cmp(lv a,lv b){
if(a.index!=b.index)
return a.index<b.index;
}
int main(){
int n;
cin>>n;
for(int i=0;i<n;++i)
cin>>pos[i];
for(int i=0;i<n;++i)
cin>>in[i];
find_(n-1,0,n-1,0);
sort(level+1,level+1+n,cmp);
for(int i=1;i<cnt;++i)
cout<<level[i].num<<" ";
cout<<level[cnt].num;
return 0;
}

猜你喜欢

转载自www.cnblogs.com/ldudxy/p/11353950.html