題目描述
輸入描述:
兩個字串,其長度n均小於等於26。
第一行為前序遍歷,第二行為中序遍歷。
二叉樹中的結點名稱以大寫字母表示:a,b,c…最多26個結點。
輸出描述:
輸入樣例可能有多組,對於每組測試樣例,
輸出一行,為後序遍歷的字串。
示例輸入
abc
bacfdxeag
xdefag
輸出bca
xedgaf
原題鏈結 總結
二叉樹基本操作,前序遍歷、後序遍歷、中序遍歷,利用遞迴可以很容易實現。但是,從前序和中序遍歷序列中提取出這棵二叉樹就不簡單了。
類別:串操作+二叉樹資料結構+分治思想
思路:1、串操作提取出二叉樹。(也就是說邊提取資料邊構造二叉樹)
2、將這棵樹通過後序遍歷函式輸出。
關於步驟一:很明顯就是採用分治思想利用遞迴(大問題可以劃分成相似的子問題+遞迴出口)。遞迴出口就是遍歷完前序串的所有資訊。在子問題的劃分上是本題的關鍵。可以通過查子樹擁有元素的數目來進行劃分,利用元素數目來偏移出,左右子樹的範圍。注意:遞迴呼叫時,盡量少使用定義的區域性變數,多使用介面傳過來的變數。這樣,可以避免操作不當導致的程式崩潰。
例如:在劃分子問題時候,左子樹的左邊界我以為都是0,然而這是錯誤的。(右子樹的左子樹的左邊界在串中的位置就不是0)顯然,這是思考不全面導致的。為了避免這種情況,完全可以用prestr_left來代替這個左邊界。就不會出現操作不當了。
code
#include
#include
using
namespace std;
class
node};
string prestr1, midstr2;
void
postvisit
(node* binarytree)
//後續遍歷一棵二叉樹
node*
creatbinarytree
(int prestr_left,
int prestr_right,
int midstr_left,
int midstr_right)
//採用分治的思想建樹
}int gapl = mid - midstr_left;
//左子樹擁有的結點數目
int gapr = midstr_right - mid;
//右子樹擁有的結點數目
//處理左子樹,用結點數目來偏移確定子樹的範圍
root-
>left =
creatbinarytree
(prestr_left +
1,prestr_left+gapl, midstr_left, mid-1)
;//處理右子樹,用結點數目來偏移確定子樹的範圍
root-
>right =
creatbinarytree
(prestr_right-gapr+
1, prestr_right, mid +
1, midstr_right)
;return root;
}int
main()
return0;
}
華中科技大學複試 二叉排序樹(重要)
題目描述 輸入一系列整數,建立二叉排序樹,並進行前序,中序,後序遍歷。輸入描述 輸入第一行包括乙個整數n 1 n 100 接下來的一行包括n個整數。輸出描述 可能有多組測試資料,對於每組資料,將題目所給資料建立乙個二叉排序樹,並對二叉排序樹進行前序 中序和後序遍歷。每種遍歷結果輸出一行。每行最後乙個...
華中科技大學複試 對稱矩陣
題目描述 輸入乙個n維矩陣,判斷是否對稱。輸入描述 輸入第一行包括乙個數 n 1 n 100 表示矩陣的維數。接下來的n行,每行包括n個數,表示n n矩陣的元素。輸出描述 可能有多組測試資料,對於每組資料,輸出 yes 表示矩陣為對稱矩陣。輸出 no 表示矩陣不是對稱矩陣。示例輸入4 16 19 1...
華中科技大學複試 找位置
題目描述 對給定的乙個字串,找出有重複的字元,並給出其位置,如 abcaaab12ab12 輸出 a,1 a,4 a,5 a,10,b,2 b,11,1,8 1,12,2,9 2,13。輸入描述 輸入包括乙個由字母和數字組成的字串,其長度不超過100。輸出描述 可能有多組測試資料,對於每組資料,按照...