PTAL2-006 树的遍历(二叉树)
Description
给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。
Input
输入第一行给出一个正整数N(≤30),是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。数字间以空格分隔。
Output
在一行中输出该树的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。
Sample Input
7
2 3 1 5 7 6 4
1 2 3 4 5 6 7
Sample Output
4 1 6 3 5 7 2
题意
二叉树模板题,此代码用以记录二叉树各种遍历方式的模板。
#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdio>
#include<queue>
#include<vector>
#include<functional>
#include<map>
#include<unordered_map>
using namespace std;
typedef long long ll;
const int N=1e5+10,NN=1e3+10,INF=0x3f3f3f3f;
const ll MOD=1e9+7;
struct node{
int value;
node *l,*r;
node(int value=0,node *l=NULL,node *r=NULL):value(value),l(l),r(r){}
};
int n,k;
int pre[N],in[N],post[N],level[N];//分别是前,中,后,层序遍历
/*void buildtree(int l,int r,int &t,node *&root){//通过先序遍历和中序遍历来建树
int flag=-1;
for(int i=l;i<=r;i++){
if(in[i]==pre[t]){
flag=i;
break;
}
}
if(flag==-1) return ;
root=new node(in[flag]);
++t;
if(flag>l) buildtree(l,flag-1,t,root->l);
if(flag<r) buildtree(flag+1,r,t,root->r);
}*/
void buildtree(int l,int r,int &t,node *&root){//通过后序遍历和中序遍历来建树
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) buildtree(flag+1,r,t,root->r);
if(flag>l) buildtree(l,flag-1,t,root->l);
}
void preorder(node *root){//求先序遍历
if(root!=NULL){
post[k++]=root->value;
preorder(root->l);
preorder(root->r);
}
}
void inorder(node *root){//求中序遍历
if(root!=NULL){
inorder(root->l);
post[k++]=root->value;
inorder(root->r);
}
}
void postorder(node *root){//求后序遍历
if(root!=NULL){
postorder(root->l);
postorder(root->r);
post[k++]=root->value;
}
}
void levelorder(node *root){//求层序遍历
queue<node*>q;
if(root!=NULL){
q.push(root);
level[k++]=root->value;
}
while(!q.empty()){
node *root=q.front();
q.pop();
if(root->l!=NULL){
q.push(root->l);
level[k++]=root->l->value;
}
if(root->r!=NULL){
q.push(root->r);
level[k++]=root->r->value;
}
}
}
void remove_tree(node *root){//释放内存
if(root==NULL) return ;
remove_tree(root->l);
remove_tree(root->r);
delete root;
}
void init(){
memset(level,0,sizeof level);
memset(post,0,sizeof post);
memset(pre,0,sizeof pre);
memset(in,0,sizeof in);
}
int main(){
while(~scanf("%d",&n)){
init();
//for(int i=1;i<=n;i++) scanf("%d",&pre[i]);//输入先序遍历
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=1;//如果通过先序和中序遍历建树,t要从1开始,因为先序遍历的第一个值就是树的根
int t=n;//如果通过后序和中序遍历建树,t要从n开始,因为后序遍历的最后一个值就是树的根
buildtree(1,n,t,root);
k=0;
//postorder(root);//输出后序遍历
//inorder(root);//输出中序遍历
//preorder(root);//输出前序遍历
levelorder(root);//输出层序遍历
for(int i=0;i<k;i++){
//printf("%d",post[i]);//打印后序遍历
//printf("%d",pre[i]);//打印前序遍历
//printf("%d",in[i]);//打印中序遍历
printf("%d",level[i]);//打印层序遍历
printf(i==k-1?"\n":" ");
}
remove_tree(root);
}
return 0;
}