题目:PAT1020Tree Traversals
题目描述:给出一棵二叉树的中序遍历和后序遍历,求其层序遍历。
解题方法:对于求解层序遍历除了使用BFS之外,还可以对每一个节点进行标号,最后对标号进行排序输出。(标号的大小不一定是连续的)
代码如下:
#include<bits/stdc++.h>
#define lowbit(x) ((x)&(-(x)))
#define ll long long
#define INF 0x3f3f3f3f
#define N 100000
#define CLR(a) memset(a, 0, sizeof(a))
using namespace std;
int n;
struct node{
int index;
int vertix;
};
vector<node> ans;
vector<int> post,in;
void level_order(int root,int st,int ed,int index){
if(st>ed)
return;//到达边界进行返回
int i=st;
while(i<ed&&in[i]!=post[root])
i++;//找到对应的根节点
ans.push_back({index,post[root]});
level_order(root-(ed-i+1),st,i-1,2*index+1);
level_order(root-1,i+1,ed,2*index+2);
}
bool cmp(node a,node b){
return a.index<b.index;
}
int main() {
cin>>n;
int tmp;
for(int i=0;i<n;i++){
cin>>tmp;
post.push_back(tmp);
}
for(int i=0;i<n;i++){
cin>>tmp;
in.push_back(tmp);
}
level_order(n-1,0,n-1,0);
sort(ans.begin(),ans.end(),cmp);
cout<<ans[0].vertix;
for(int i=1;i<ans.size();i++){
cout<<' '<<ans[i].vertix;
}
return 0;
}