1. 程式人生 > >根據中序和後序求解層序遍歷( 正在做pta的勿抄 資料結構老師會查重)

根據中序和後序求解層序遍歷( 正在做pta的勿抄 資料結構老師會查重)

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;



}