L2-006. 树的遍历
时间限制
400 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
陈越
给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。
输入格式:
输入第一行给出一个正整数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<string>
#include<queue>
using namespace std;
//首先根据二叉树的后序和中序确定二叉树,然后层次遍历的到的二叉树
//1.如何确定二叉树
// 根据后序判断根节点,根据中序判断左右孩子
// 例如 后 2 3 1 5 7 6 4 post[]
/// 中 1 2 3 4 5 6 7 in[]
// (1)creat(ps,pe,is,ie)判断根节点 递归边界是 ps>pe
// (2)先在in中找到根节点在的位置 k
// (3)递归求左孩子creat(ps,ps+k-1,is,k-1)
// 右孩子creat(ps+k-1,pe-1,k+1,in)
//2.广搜输出层次遍历
int post[100],in[100],n;
struct node
{
int data;//元素
node *ld;//递归构造左孩子指针
node *rd;//递归构造右孩子指针
};
node *create(int ps,int pe,int is,int ie)
{
if(ps>pe)
return NULL;//结束条件
node *b=new node;//动态创建根节点
b->data=post[pe];//获得根节点的元素
int k;
for(k=is;k<=ie;k++)
{
if(in[k]==post[pe])//在in中找根节点
break;
}
int num=k-is;
b->ld=create(ps,ps+num-1,is,k-1);
b->rd=create(ps+num,pe-1,k+1,ie);
return b;
}
int sum=0;
int bfs(node *root)
{
queue<node*>q;
node *temp;
q.push(root);
while(!q.empty())
{
temp=q.front();
q.pop();
cout<<temp->data;
sum++;
if(sum<n) cout<<" ";//控制格式
if(temp->ld!=NULL) q.push(temp->ld);
if(temp->rd!=NULL) q.push(temp->rd);
}
}
int main()
{
cin>>n;
for(int i=0;i<n;i++)
{
cin>>post[i];
}
for(int i=0;i<n;i++)
{
cin>>in[i];
}
node *r=create(0,n-1,0,n-1);
//cout<<r->data<<endl;
bfs(r);
}