题目:
给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。
输入格式:
输入第一行给出一个正整数N(<=30),是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。数字间以空格分隔。
输出格式:
在一行中输出该树的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。
输入样例:7 2 3 1 5 7 6 4 1 2 3 4 5 6 7输出样例:
4 1 6 3 5 7 2
代码:
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
const int maxn=35;
int InOrder[maxn],PostOrder[maxn];
struct Node{//定义树的左右两个子树
int r,l;
}a[maxn];
// 中序遍历[l1....l2]后序遍历[r1....r2]
int build(int l1,int l2,int r1,int r2){
if(l1>l2) return 0;//空树
int root = PostOrder[r2];//定义根节点
int p = l1;
while(InOrder[p] != root) p++;//寻找根节点
int cnt = p-l1;
a[root].l = build(l1,p-1,r1,r1+cnt-1);//建立左子树
a[root].r= build(p+1,l2,r1+cnt,r2-1);//建立右子树
return root;
}
void bfs(int x){//层次(广度优先搜索)
queue<int>q;//队列
vector<int>v;//不等长数组
q.push(x);//将x压入队列
while(!q.empty()){
int w = q.front();//取队列首元素(不删除)
q.pop();//出队列
if(w == 0) break;//判空
v.push_back(w);//结果放在不等长数组中
if(a[w].l!=0){
q.push(a[w].l);
}
if(a[w].r!=0){
q.push(a[w].r);
}
}
int len = v.size();
for(int i=0;i<len;i++){//输出
printf("%d%c",v[i],i==len-1?'\n':' ');
}
return ;
}
int main(){
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&PostOrder[i]);
}
for(int i=0;i<n;i++){
scanf("%d",&InOrder[i]);
}
build(0,n-1,0,n-1);//建树
int root = PostOrder[n-1];//找树根
bfs(root);//广度优先遍历
return 0;
}