7-4 树的遍历 (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>
#define maxn 101
typedef int TElem;
typedef struct TNode{
TElem data;
struct TNode *lchild,*rchild;
}TNode,*BinTree;
BinTree CreateTree(int A[],int B[],int n){
BinTree BT = (BinTree)malloc(sizeof(struct TNode));
if(n<=0) return NULL;
else{
int temp = A[n-1];
int i;
for(i=0;i<n;i++){ //找到中序遍历根节点所在的相应位置
if(temp== B[i]){
break;
}
}
BT->data = temp; //在树中生成相应数据的节点
//之后先后遍历左右子树即可
BT->lchild = CreateTree(A,B,i);
BT->rchild = CreateTree(A+i,B+i+1,n-i-1);
return BT;
}
}
//层序遍历
void LevelTraversal(BinTree BT){
BinTree a[101]; //建立一个存储树节点的数组
//这个数组作为队列来用
//将之后初始的根节点存入数组的a[0]
//之后每一次取出根节点时,将其左右子节点继续存入数组
//总而言之,用队列的思想即可解决这个问题
int i=0,j=0;
a[0] = BT;
while(BT){
if(BT->lchild!=NULL){
a[++i] = BT->lchild;
}
if(BT->rchild!=NULL){
a[++i] = BT->rchild;
}
BinTree temp = a[j];
printf("%d",temp->data);
if(i==j){
break;
}else printf(" ");
j++;
BT = a[j];
}
}
int main(){
int n;
scanf("%d",&n);
int i;
int A[maxn],B[maxn];
for(i=0;i<n;i++){
scanf("%d",&A[i]);
}
for(i=0;i<n;i++){
scanf("%d",&B[i]);
}
BinTree BT = CreateTree(A,B,n);
LevelTraversal(BT);
return 0;
}