PTAL2-006 树的遍历(二叉树)

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;
}

猜你喜欢

转载自blog.csdn.net/Hc_Soap/article/details/107369446