L2-006. 树的遍历
时间限制
400 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
陈越
给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。
输入格式:
输入第一行给出一个正整数N(<=30),是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。数字间以空格分隔。
输出格式:
在一行中输出该树的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。
输入样例:
72 3 1 5 7 6 41 2 3 4 5 6 7
输出样例:
4 1 6 3 5 7 2
#include<iostream>
using namespace std;
#include<math.h>
#include<string.h>
#include<algorithm>
#include<deque>
int bhd[31],mid[31];
int a[30];
typedef struct Tree{
int x;
char c;
Tree *left;
Tree *right;
}Tree ,*BiTree;
deque<BiTree> d;
BiTree createTree(BiTree T,int bhd[],int mid[],int length){ //给定中序遍历和后序遍历,确定一颗二叉树
int pos;
T=(BiTree)malloc(sizeof(Tree));
if(!T){
exit(0);
}
if(length==0) //当该树的长度为零的时候,返回一颗空树
return NULL;
for(pos=0;pos<length;pos++){
if(mid[pos]==bhd[0])
break;
}
T->x=bhd[0];
T->left=createTree(T->left,bhd+length-pos,mid,pos); //插入左子树
T->right=createTree(T->right,bhd+1,mid+pos+1,length-1-pos); //插入右子树
return T;
}
void cxshowTree(BiTree T){
int p=0;
if(T!=NULL)
d.push_back(T);
while(d.size()!=0){
T=d.at(0);
a[p++]=T->x;
if(T->left!=NULL)
d.push_back(T->left);
if(T->right!=NULL)
d.push_back(T->right);
d.pop_front();
}
}
int main(){
Tree *T;
int i,j,k,n;
int b[31];
//freopen("input.txt","r",stdin);
cin>>n;
for(i=0;i<n;i++){ //输入后序遍历
cin>>b[i];
}
for(i=0;i<n;i++){
bhd[i]=b[n-i-1];
}
for(i=0;i<n;i++){ //输入遍历
cin>>mid[i];
}
T=createTree(T,bhd,mid,n);
cxshowTree(T); //层序遍历该树
for(i=0;i<n;i++){
cout<<a[i];
if(i!=n-1)
cout<<" ";
}
return 0;
}