给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。
输入格式:
输入第一行给出一个正整数N(≤30),是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。数字间以空格分隔。
输出格式:
在一行中输出该树的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。
#include<iostream>
#include<iomanip>
#include<queue>
using namespace std;
typedef struct Tree{
int data;
struct Tree *l,*r;
}sqtree,*linktree;
linktree inicreatree(int e)//输入 元素创造节点
{
linktree tree=new sqtree;
tree->data=e;
tree->l=NULL;
tree->r=NULL;
return tree;
}
linktree bbtree(int a[],int b[],int ai,int bi,int len)
{
int i;
if(len<=0)
return NULL;
linktree tree;
tree=inicreatree(a[ai]);
if(len==1)
return tree;
for(i=bi-len+1;i<=bi;i++)//中后序遍历 创造二叉树
{ //就是一直找其左右子树的长度和位置后递归
if(a[ai]==b[i])
break;
}
tree->l=bbtree(a,b,ai-1-bi+i,i-1,len-1-bi+i);
tree->r=bbtree(a,b,ai-1,bi,bi-i);
return tree;
}
int pptree(linktree tree)//层序遍历
{
if(tree==NULL)
return 0;
queue<linktree> q;//利用c++stl快速创建一个队列
q.push(tree);
while(!q.empty())//队列判空
{
tree=q.front();
q.pop();
if(tree->l)
q.push(tree->l);
if(tree->r)
q.push(tree->r);
cout<<tree->data;
if(!q.empty())
cout<<" ";
}
return 1;
}
main()
{
linktree tree;
int n,a[31],b[31],i;
cin>>n;
for(i=1;i<=n;i++)
cin>>a[i];
for(i=1;i<=n;i++)
cin>>b[i];
tree=bbtree(a,b,n,n,n);
pptree(tree);
}