華中科技大學複試 二叉樹遍歷

2021-10-04 17:25:15 字數 1672 閱讀 6153

題目描述

輸入描述:

兩個字串,其長度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。輸出描述 可能有多組測試資料,對於每組資料,按照...