- 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。
- 输入格式:
输入第一行给出一个正整数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 post[31],mid[31];
template<typename DataType>
struct BiNode
{
DataType data;
BiNode<DataType>*lchild,*rchild;
BiNode(DataType n)
{
data=n;
lchild=nullptr;
rchild=nullptr;
}
};
template<typename DataType>
class BiTree
{
private:
BiNode<DataType>*root; //根节点
BiNode<DataType>*Create(DataType *p,DataType *q,int n);
public:
BiTree()
{
int n;
cin>>n;
int *p,*q;
p=new int [n];
q=new int [n];
for(int i=0;i<n;i++)
{
cin>>p[i]; //后序遍历
}
for(int i=0;i<n;i++)
{
cin>>q[i]; //中序遍历
}
root=Create(p,q,n);
}
void Levelorder(); //层序遍历
};
template<typename DataType>
BiNode<DataType> *BiTree<DataType>::Create(DataType *p,DataType *q,int n)
{
if(n<=0)
{
return NULL;
}
else
{
int i=0;
int a=p[n-1]; //a为根节点
while(q[i]!=a)
{
i++;
}
BiNode<DataType> *t=new BiNode<DataType>(a);
t->lchild=Create(p,q,i);
t->rchild=Create(p+i,q+i+1,n-i-1);
return t;
}
}
template<typename DataType>
void BiTree<DataType>::Levelorder()
{
int flag=1;
BiNode<DataType> *Q[100],*q=nullptr;
int front=-1,rear=-1;
if(root==nullptr) return; //二叉树为空,算法结束
Q[++rear]=root;
while(front!=rear) //当队列非空时
{
q=Q[++front];
if(flag==1)
{
cout<<q->data;
flag=0;
}
else
{
cout<<" "<<q->data;
}
if(q->lchild!=nullptr) Q[++rear]=q->lchild;
if(q->rchild!=nullptr) Q[++rear]=q->rchild;
}
}
int main()
{
BiTree<int>a;
a.Levelorder();
return 0;
}
本题核心思想在于通过树的后序遍历和中序遍历来唯一确定树,通过递归的方法来确定唯一树,细节在于找到根节点,后通过递归的调用构建唯一树。层序遍历的代码参考了《数据结构-从概念到C++实现(第3版)中的代码。
初来乍到,如有良策,还请斧正,