前沿:算法
前段時間參加了:小米、東軟、百度的筆試,多家公司都出了一道相似二叉樹題來考查筆試者對二叉樹基礎掌握的狀況。ide
一:筆試題描述 |
1:有一顆二叉樹:前序遍歷輸出的字符串順序爲:ABCDEFGspa
中序遍歷輸出的順序是:CBDAEGF設計
2:問?請根據前序和中序遍歷出的結果,推斷出後序遍歷輸出的結果?code
二:解決以上問題依據的知識點以下: |
二叉樹三種遍歷的方式:orm
前序遍歷(NLR): 根->左孩子->右孩子blog
中序遍歷(LNR): 左孩子->根->右孩子ci
後序遍歷(LRN): 左孩子->右孩子->根字符串
三:問題分析 |
第一步:前序:ABCDEFGget
根據前序遍歷的原則咱們能夠肯定:二叉樹的根元素爲:A
第二步:根據中序 CBDAEGF
1:原則:左孩子->根->右孩子
2:推出:CBD(根左邊的元素) A(根元素) EGF(根右邊的元素)
第三步:根據 前序和中序輸出的結果來還原一棵二叉樹
前序輸出:A(根) BCD(左邊元素) EFG(右邊的元素)
根據前序遍歷的原則:根->左孩子->右孩子
推出:以下圖:
第四步:B元素後面是C元素,C元素有二種可能1:B的左孩子2:B的右孩子
咱們假設C是B的右孩子:獲得以下圖:
驗證:咱們來看看中序:CBD(左邊元素) A(根) EGF(右邊元素)
中序的遍歷規則是: 左孩子->根->右孩子,若是按照上面的假設C是B的右孩子
中序遍歷時應該是:BC..顯然不對,所以C應該是B的左孩子.所以進一步得出以下:
第五步: 根據前序:A(根) BCD(根左邊的元
素) EFG(根右邊的元素)
分析:
C元素後面緊跟是D元素
D元素如今有三種可能:B的右孩子,C的左孩子或者右孩子
1:若是D是C的左孩子,圖下圖:
驗證:
1:若是D是C的右孩子,那麼中序遍歷根的左邊應該是:DCB與中序CBD不相符合,因此不對
2:若是是右孩子:中序遍歷,根的左邊應該是:CDB與CBD也不相符合,因此不對
3:綜上得出D應該是B的右孩子,以下圖:
第六步:根據以上的思路,我能夠把根的右邊也還原,得出完整的二叉樹結構以下:
第七步:根據後序遍歷:左孩子->右孩子->根的遍歷原則:
所以很容易得出後序爲:CDBGFEA
因此最終答案 爲:CDBGFEA
ps:
有人說:算法是程序設計的靈魂 | 我說:算法能激活我更多的思惟 |在算法的道路上我纔剛剛開始|加油|堅持!
coder:亮仔 2012-10-7