7-77 樹的遍歷 c語言(25分)
阿新 • • 發佈:2020-12-22
7-77 樹的遍歷 (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 ERROR 0
typedef int element_type;
typedef struct Bnode
{
element_type data;
struct Bnode *Lson,*Rson;
int height;
}Bnode,*Bptr;
Bptr creat(element_type a[],element_type b[],int i,int j,int s,int t)
{
int k;
Bptr p;
if(i>j) return NULL;
p=(Bptr)malloc(sizeof(Bnode));
p->data= a[j];
k=s;
while((k<=t)&&(b[k]!=a[j])) k++;
if(b[k]!=a[j]) exit(ERROR);
p->Lson=creat(a,b,i,i+k-s-1,s,k-1);
p->Rson=creat(a,b,i+k-s,j-1,k+1,t);
return p;
}
void put(Bptr p)//層序遍歷(佇列思想)
{
if(p==NULL) return;
int flag=0;
Bptr queue[50];
int front=-1;
int rear=0;
queue[rear]=p;
while (front!=rear)
{
front++;//保證輸出的第一個數之前沒有空格
if(flag++) printf(" ");
printf("%d",queue[front]->data);
if(queue[front]->Lson!=NULL)
{
rear++;
queue[rear]=queue[front]->Lson;
}
if(queue[front]->Rson!=NULL)
{
rear++;
queue[rear]=queue[front]->Rson;
}
}
}
int main()
{
Bptr root;
element_type a[100],b[100];
int N,i=0,j=0,s=0,t=0;
scanf("%d",&N);
for(;j<N;j++)
scanf("%d",&a[j]);
for(;t<N;t++)
scanf("%d",&b[t]);
root=creat(a,b,i,j-1,s,t-1);
put(root);
}