根據中序和後序求解層序遍歷( 正在做pta的勿抄 資料結構老師會查重)
阿新 • • 發佈:2018-11-22
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; }