给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。
输入格式:
输入第一行给出一个正整数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<cstdio>
#include<iostream>
#include<cmath>
#include<queue>
#include<cstring>
using namespace std;
typedef struct tree{
int num;
struct tree *right,*left;
}tree,*linktree;
int n;
int zhong[31],hou[31];
linktree creat(int hou[],int zhong[],int n){
if(n<=0) return NULL;
linktree t=new tree();
int index=0;
t->num=hou[n-1];
for(int i=0;i<n;i++){
if(zhong[i]==t->num){
index=i;
break;
}
}
t->left=creat(hou,zhong,index);
t->right=creat(hou+index,zhong+index+1,n-index-1);
return t;
}
void printfs(linktree head){
queue<linktree> que;
printf("%d",head->num);
que.push(head->left);
que.push(head->right);
while(que.size()){
linktree t=que.front();
que.pop();
if(t==NULL) continue;
printf(" %d",t->num);
que.push(t->left);
que.push(t->right);
}
}
int main(){
cin>>n;
for(int i=0;i<n;i++) scanf("%d",&hou[i]);
for(int i=0;i<n;i++) scanf("%d",&zhong[i]);
linktree head=creat(hou,zhong,n);
printfs(head);
return 0;
}