02-树的遍历

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

输入格式:

输入第一行给出一个正整数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>
using namespace std;
int n;
int postOrder[31],inOrder[31];
class Binode
{
	public:
	int data;
	Binode *lchild;
	Binode *rchild;
};
class Bitree
{
	public:
	Binode *root;
	void built(Binode *&root,int l_in,int r_in,int l_post,int r_post);
	void levelOrder(int n);
};
//其实l_post没用,在参数表里写上纯属是为了好看,因为后序遍历结果有用的部分只有最后一个数,即根节点 
void Bitree::built(Binode *&root,int l_in,int r_in,int l_post,int r_post)
{
	if(l_in>r_in)
	{
		root=NULL;
		return;
	}
	root=new Binode;
	root->data=postOrder[r_post];
	int p1=l_in;
	while(inOrder[p1]!=root->data)
	{
		p1++;//p1指根节点在中序遍历数组中的下标 
	}
	int p2=p1-l_in;//p2指左子树节点的个数 
	built(root->lchild,l_in,p1-1,l_post,l_post+p2-1);
	built(root->rchild,p1+1,r_in,l_post+p2,r_post-1); //注意是 r_post-1,因为最后一个为当前的根节点,要在下一次建树的时候去掉 
}
void Bitree::levelOrder(int n)
{
	Binode *queue[n+2];
	Binode *p=this->root;
	int head=1;
	int tail=1;
	queue[tail]=p;
	tail++;
	while(head<tail)
	{
		p=queue[head++];
		n--;
		if(n!=0)
		cout<<p->data<<" ";
		else
		cout<<p->data<<endl;
		if(p->lchild)
		{
			queue[tail]=p->lchild;
			tail++;
		}
		if(p->rchild)
		{
			queue[tail]=p->rchild;
			tail++;
		}
	}
}
int main()
{
	cin>>n;	
	for(int i=1;i<=n;i++)
	cin>>postOrder[i];
	for(int i=1;i<=n;i++)
	cin>>inOrder[i];
	Bitree tree;
	tree.built(tree.root,1,n,1,n);
	tree.levelOrder(n);
}
发布了10 篇原创文章 · 获赞 1 · 访问量 351

猜你喜欢

转载自blog.csdn.net/ZZ666666ZZ/article/details/104563757
02-