1. 程式人生 > >二叉樹遍歷題解(已知中序,層次遍歷,求後序遍歷)

二叉樹遍歷題解(已知中序,層次遍歷,求後序遍歷)

題目:

樹和二叉樹基本上都有先序、中序、後序、按層遍歷等遍歷順序,給定中序和其他一種遍歷的序列就可以確定一棵二叉樹的結構。

假設一棵二叉樹一個結點用一個字元描述,現在給出中序和按層遍歷的字串,求該樹的先序遍歷字串。

輸入:

輸入共兩行,每行是由字母組成的字串(一行的每個字元都是唯一的),分別表示二叉樹的中序遍歷和按層遍歷的序列。

輸出:

輸出就一行,表示二叉樹的先序序列。

樣例輸入:DBEAC

                  ABCDE

樣例輸出:ABDEC

題解:

本題不需要建樹。

做題前先弄明白中序遍歷和層次遍歷的特點;

首先中序遍歷的根結點左側為左子樹,右側為右子樹,而先序遍歷優先輸出根結點,再遍歷左子樹,最後遍歷右子樹,因此,不難想到,先在中序遍歷中找到根結點,再先後遞迴左右子樹;

然後,我們單開一個數組從1到結尾給層次遍歷的結果做標記,方便在遞迴中找到根結點(即使遞迴到了子樹也可行)。見程式碼:

#include<stdio.h>
#include<string.h>
int len,mark[102];                                                             //用來給中序遍歷做標記
char s1[102],s2[102];                                                    //儲存遍歷
void tree(int l,int r){                                                          //遞迴函式
    if(l>r)return;                                                               //返回條件,不能等於
    int i,j,min=0x7fffff/*int範圍的最大值*/,root;
    for(i=l;i<=r;i++){
        if(mark[s1[i]]<min){
            min=mark[s1[i]];root=i;                                        //在中序遍歷中找到層次遍歷裡的最靠前的結點(即先序遍歷中要求優先輸出的根結點
        }         
    }   
    printf("%c",s1[root]);                                                  //輸出根結點
    tree(l,root-1);                                                             //先遍歷左子樹
    tree(root+1,r);                                                              //再遍歷右子樹,順序不能調換
}
int main(){
    scanf("%s%s",s1+1,s2+1);
    len=strlen(s2+1);
    int i;
    for(i=1;i<=len;i++)
        mark[s2[i]]=i;                                                             //做標記,雖然s2[i]為字元,但視為ASCII碼值,越靠前標記值越小
    tree(1,len);    
}


歡迎指點