1. 程式人生 > 其它 >7-77 樹的遍歷 c語言(25分)

7-77 樹的遍歷 c語言(25分)

技術標籤:二叉樹c語言

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); }