時間限制: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 ****************************************************************/