给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。
输入格式:
输入第一行给出一个正整数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<bits/stdc++.h>
using namespace std;
const int N=1010;
int k;
int per[N],in[N],post[N];
//定义二叉树
struct node{
int val;
node *left;
node *right;
node(int x):val(x),left(NULL),right(NULL){}
//node(int val=0,node *left=NULL,node*right=NULL):val(val),left(left),right(right){}
};
//建树
void build(int l,int r,int &t,node *&root){//t应该是后序的最后一位是根节点,然后从后向前遍历
int flag=-1;//!!
for(int i=l;i<=r;i++) //中序应该不需要管遍历顺序吧
if(in[i]==post[t]){
flag=i;break;
}
if(flag==-1) return ;
//
root=new node(in[flag]);
//
t--;
/知道中序和后序,先递归右子树;;;知道先序和中序,先递归左子树
if(flag<r) build(flag+1,r,t,root->right);
if(flag>l) build(l,flag-1,t,root->left);
}
//层序遍历(暂时不会先空着)
//(层序遍历用队列)
void level(node *T,int n){
//node*
queue<node*>queue;
queue.push(T);//根节点放入队列
while(!queue.empty()){//
//1.
T=queue.front();//对头元素出队,指针重新指向,front.()是将返回头元素但不删除
printf("%d",T->val);//父节点出队后,将左右孩子放入队列;
if(n!=1) cout<<" ";
n--;
queue.pop();//删除队首元素
//2.
if(T->left!=NULL)
queue.push(T->left);//如果首元素的左子树不是空,将其左子树放入队列
//入对的是一个地址元素
//3.
if(T->right!=NULL)
queue.push(T->right);
}
}
//清空
void re_free(node *root){
if(root==NULL) return ;
re_free(root->left);
re_free(root->right);
delete root;
}
int main(){
int n;
while(~scanf("%d",&n)){
for(int i=1;i<=n;i++) scanf("%d",&post[i]);
for(int i=1;i<=n;i++) scanf("%d",&in[i]);
node *root;
int t=n;
build(1,n,t,root);
//缺一块层序遍历的代码及输出(先空着)
level(root,n);
cout<<endl;
//
re_free(root);
}
return 0;
}