7-4 树的遍历 (20分)
给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。
输入格式:
输入第一行给出一个正整数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
AC
这一次要求实现层次遍历,呵呵呵,不按照我的套路出牌,找了找课本,打出来了。
这是用队列实现的。采用循环数组。
#include<iostream>
#include<algorithm>
using namespace std;
typedef struct TNode {
int data;
struct TNode *left;
struct TNode *Right;
}*Tree,Node;
int N;
int a[999],b[999];
Tree setTree(int *a,int *b,int len) {
if(len==0)
return NULL;
Tree t;
t=(Node *)malloc(sizeof(Node));
t->data=a[len-1];
int i;
for(i=0; i<len; i++) {
if(b[i]==a[len-1])
break;
}
t->left=setTree(a,b,i);
t->Right=setTree(a+i,b+1+i,len-i-1);
return t;
}
void Print(Tree t) {
if(t==NULL)
return ;
Tree queue[N];//定义了Tree类型的数组,采用队列方式求解
int cnt=0;
int front=-1,rear=0;
queue[rear]=t;
//这里就是t,t和queue数组都是Tree
while(front!=rear) {
front++;
if(cnt++)
cout<<" ";
cout<<queue[front]->data;
if(queue[front]->left!=NULL) {
rear++;
queue[rear]=queue[front]->left;
}
if(queue[front]->Right!=NULL) {
rear++;
queue[rear]=queue[front]->Right;
}
}
}
int main() {
cin>>N;
for(int i=0; i<N; i++)
cin>>a[i];
for(int i=0; i<N; i++)
cin>>b[i];
Tree T=setTree(a,b,N);
Print(T);
return 0;
}
简化版本C++
#include<iostream>
#include<algorithm>
using namespace std;
typedef struct node *Tree;
struct node {
int data;
Tree left;
Tree right;
};
int n;
Tree setTree(int a[],int b[],int n) {
if(n==0)
return NULL;
Tree t;
int x;
t=(Tree)malloc(sizeof(struct node));
t->data=a[n-1];
for(x=0; x<n; x++)
if(t->data==b[x])
break;
t->left=setTree(a,b,x);
t->right=setTree(a+x,b+x+1,n-x-1);
return t;
}
void Print(Tree t) {
//用队列来操作层次输出
Tree q[n];
int f=0,r=0;
q[r++]=t;//存入跟节点
int cnt=0;
while(f<r) {
Tree x=q[f++];//取出最前面的那一个元素
if(cnt++)
cout<<" ";
cout<<x->data;
if(x->left)
q[r++]=x->left;
if(x->right)
q[r++]=x->right;
}
}
int main() {
cin>>n;
int a[n],b[n];
for(int i=0; i<n; i++)
cin>>a[i];
for(int i=0; i<n; i++)
cin>>b[i];
Tree t=setTree(a,b,n);
Print(t);
return 0;
}