7-6 树的遍历(25 分)
给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。
输入格式:
输入第一行给出一个正整数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<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
int zhong[10000];
int hou[10000];
struct Tree{
int data;
struct Tree *left,*right;
};
struct Tree*creat(int h1,int h2,int z1,int z2){ //后序首位置 后序末位置 中序首位置 中序末位置
/*
struct Tree *T;
int i;
if(n<=0){
T=NULL;
}else{
T=(struct Tree*)malloc(sizeof(struct Tree)); //首先要分配空间 才能在T中村播放数据
T->data=hou[n-1];
for(i=0;hou[n-1]!=zhong[z+i];i++);
T->left=creat(h,z,i);
T->right=creat(h+i,z+i+1,n-i-1);
}
return T;*/
struct Tree* T;
int i,t;
if(h1>h2) //大小控制正确 起初做题把大于号写成了小于号 细心
T=NULL;
else{
T=(struct Tree*)malloc(sizeof(struct Tree)); //首先要分配空间 才能在T中村播放数据
T->data=hou[h2];
for(i=z1;i<=z2;i++){
if(hou[h2]==zhong[i]){
break;
}
}
t=i-z1;
T->left=creat(h1,h1+t-1,z1,i);
T->right=creat(h1+t,h2-1,i+1,z2);
}
return T;
}
void cengci(struct Tree *T,int n){
struct Tree *q,*p[1000];
int f=0,r=0,cnt=0;
if(T){
p[r++]=T;
while(f!=r){
q=p[f++];
printf("%d",q->data);
cnt++;
if(cnt<n){
cout<<" ";
}else{
cout<<endl;
}
if(q->left!=NULL)
p[r++]=q->left;
if(q->right!=NULL)
p[r++]=q->right;
}
}
}
int main(){
struct Tree *T;
int n,i;
cin>>n;
for(i=0;i<n;i++){
cin>>hou[i];
}
for(i=0;i<n;i++){
cin>>zhong[i];
}
T=creat(0,n-1,0,n-1);
cengci(T,n);
}