2018.1.19 Fri
已知二叉樹的先序遍歷序列和中序遍歷序列,求其后序遍歷序列
例:
先序遍歷:ABDGCEFH
中序遍歷:DGBAECHF
解:
首先要先知道各種遍歷方式的規則:
先序遍歷(先根遍歷、前序遍歷):1. 訪問根結點2. 遍歷左子樹3. 遍歷右子樹
中序遍歷(中根遍歷):1. 遍歷左子樹2. 訪問根結點3. 遍歷右子樹
后序遍歷(后根遍歷):1. 遍歷左子樹2. 遍歷右子樹3. 訪問根結點
且無論哪種遍歷,左右子樹仍然遵循該遍歷規則。若沒有左子結點或右子結點(即不是滿二叉樹,如圖2)則輸出一個空代替一下就好,然后繼續遍歷。例如圖二中后序遍歷為:BOA,即BA。
因為先序遍歷是先訪問根節點,所以A一定是根節點。因此可以進行如下拆分:
先序遍歷:A BDGCEFH
中序遍歷:DGB A ECHF
又因為中序遍歷的順序是:左子樹,根節點,右子樹,所以再拆
先序遍歷:A BDG CEFH
中序遍歷:DGB A ECHF
然后同理看BDG樹
先序遍歷:B DG
中序遍歷:DG B
得到B是A的左子結點。
同理看DG樹:
先序遍歷:D G
中序遍歷:D G
得到D是B的左子結點, G是D的右子結點。(因為如果G是左子結點的話中序遍歷是GD)。
得到了左子樹。
右子樹同理:
先序遍歷:C E FH
中序遍歷:E C HF
得到C是A的右子結點,E是C的左子結點。
先序遍歷:F H
中序遍歷:H F
得到F是C的右子結點,H是F的左子結點。
得到右子樹。
得到如圖1的二叉樹。
然后得到后序遍歷:
GDBEHFCA