前沿:
前段時間參加了:小米、東軟、百度的筆試,多家公司都出了一道類似二叉樹題來考查筆試者對二叉樹基礎掌握的情況。
一:筆試題描述 |
1:有一顆二叉樹:前序遍歷輸出的字符串順序爲:ABCDEFG
中序遍歷輸出的順序是:CBDAEGF
2:問?請根據前序和中序遍歷出的結果,推斷出後序遍歷輸出的結果?
二:解決以上問題依據的知識點如下: |
二叉樹三種遍歷的方式:
前序遍歷(NLR): 根->左孩子->右孩子
中序遍歷(LNR): 左孩子->根->右孩子
後序遍歷(LRN): 左孩子->右孩子->根
三:問題分析 |
第一步:前序:ABCDEFG
根據前序遍歷的原則我們可以確定:二叉樹的根元素爲: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