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 · 访问量 353 私信 关注
标签:02,Binode,遍历,int,tail,post,root 来源: https://blog.csdn.net/ZZ666666ZZ/article/details/104563757