九度OJ題目1078:二叉樹遍歷

題目1078:二叉樹遍歷

時間限制:1 秒

內存限制:32 兆

特殊判題:

題目描述:

二叉樹的前序、中序、後序遍歷的定義:
前序遍歷:對任一子樹,先訪問跟,然後遍歷其左子樹,最後遍歷其右子樹;
中序遍歷:對任一子樹,先遍歷其左子樹,然後訪問根,最後遍歷其右子樹;
後序遍歷:對任一子樹,先遍歷其左子樹,然後遍歷其右子樹,最後訪問根。
給定一棵二叉樹的前序遍歷和中序遍歷,求其後序遍歷(提示:給定前序遍歷與中序遍歷能夠唯一確定後序遍歷)。

輸入:

兩個字符串,其長度n均小於等於26。
第一行爲前序遍歷,第二行爲中序遍歷。
二叉樹中的結點名稱以大寫字母表示:A,B,C....最多26個結點。

輸出:

輸入樣例可能有多組,對於每組測試樣例,
輸出一行,爲後序遍歷的字符串。

樣例輸入:
ABC
BAC
FDXEAG
XDEFAG
樣例輸出:
BCA
XEDGAF
來源:
2006年清華大學計算機研究生機試真題 
 
#include <stdio.h>
#include <string.h>
 
void to_post(char pre[], char in[], char post[], int len){  //遞歸定義由二叉樹的前序遍歷和中序遍歷確定後序遍歷的方法
    int i;
 
    if (len <= 0)
        return;
 
    for (i=0; i<len; ++i)
        if (in[i] == pre[0])
            break;
    post[len-1] = pre[0];
    to_post (pre+1, in, post, i);
    to_post (pre+i+1, in+i+1, post+i, len-i-1);
}
 
int main(void){
    char pre[30], in[30], post[30];
    int len;
 
    while (scanf ("%s", pre) != EOF){  //輸入前序遍歷
        scanf ("%s", in); ////輸入中序遍歷
        len = strlen (pre);
        to_post (pre, in, post, len);
        post[len] = '\0';
        printf ("%s\n", post);  //輸出結果
    }
 
    return 0;
}
/************************************************************** 
    Problem: 1078 
    User: zpy
    Language: C++ 
    Result: Accepted 
    Time:0 ms 
    Memory:1020 kb 
****************************************************************/  

                            
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章