根据后序和中序遍历 输出层序

给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。

输入格式:

输入第一行给出一个正整数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<queue>
using namespace std;
struct node{
	int data;
	node* lchild;
	node* rchild;
};
int post[35],in[35];
queue<node*> q;
//根据后序和中序 建tree 
node* buildtree(int postl,int postr,int inl,int inr)
{
	if(inl>inr) return NULL;// 出口 -节点没有左右孩子,为空 
	node* root=new node;
	root->data=post[postr];
	int i; 
	//在中序遍历中找到根节点 
	for(i=inl;i<=inr;i++)
	{
		if(in[i]==post[postr])
		  break;
	}
	//左孩子 右孩子 
	int num=i-inl;
	root->lchild=buildtree(postl,postl+num-1,inl,i-1);
	root->rchild=buildtree(postl+num,postr-1,i+1,inr);
	return root;
} 
void print()
{
	int i=1;
	while(!q.empty())
	{
		if(q.front()->lchild!=NULL)
		   q.push(q.front()->lchild);
		if(q.front()->rchild!=NULL)
		  q.push(q.front()->rchild);
		if(i==1)
		   printf("%d",q.front()->data);
		else
		   printf(" %d",q.front()->data);
		q.pop();
		i++;
	}
}
int main()
{
	int n,i;
	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=buildtree(1,n,1,n);
	q.push(root);
	print(); 
	return 0;
} 

猜你喜欢

转载自blog.csdn.net/daoshen1314/article/details/88311792