已知二叉樹的兩種遍歷,求另乙個遍歷

2022-10-09 00:36:11 字數 2276 閱讀 3841

第一種:已知前序遍歷、中序遍歷求後序遍歷

前序遍歷:abcdef

中序遍歷:cbdaef

在進行分析前讀者需要知道不同遍歷結果的特點

1、前序遍歷的第一元素是整個二叉樹的根節點

2、中序遍歷中根節點的左邊的元素是左子樹,根節點右邊的元素是右子樹

3、後序遍歷的最後乙個元素是整個二叉樹的根節點

(如果讀者不明白上述三個特點,建議再回去看一下三種不同遍歷對應的**,並在紙上寫出乙個簡單的二叉樹的三種不同的遍歷結果,以加深對三種不同遍歷的理解)

用上面這些特點來分析遍歷結果,

第一步:先看前序遍歷a肯定是根節點

第二步:確認了根節點,再來看中序遍歷,中序遍歷中根節點a的左邊是cbd,右邊是ef,所有可以確定二叉樹既有左子樹又有右子樹

第三步:先來分析左子樹cbd,那麼cbd誰來做a的左子樹呢?這個時候不能直接用中序遍歷的特點(左->根->右)得出左子樹應該是這個樣子

因為有兩種情況都滿足中序遍歷為cbd

無法直接根據中序遍歷來直接得出左子樹的結構,這個時候就要返回到前序遍歷中去

觀察前序遍歷abcdef,左子樹cbd在前序遍歷中的順序是bcd,意味著b是左子樹的根節點(這麼說可能不太好理解,換個說法就是b是a的左子樹),得出這個結果是因為如果乙個二叉樹的根節點有左子樹,那麼

這個左子樹一定在前序遍歷中一定緊跟著根節點(這個是用前序遍歷的特點(根->左->右)得出的),到這裡就可以確認b是左子樹的根節點

第四步:再觀察中序遍歷cbdaef,b元素左邊是c右邊是d,說明b節點既有左子樹又有右子樹,左右子樹只有乙個元素就可以直接確定了,不用再返回去觀察前序遍歷

第五步:到這裡左子樹的重建就已經完成了,現在重建右子樹,因為重建右子樹的過程和左子樹的過程一模一樣,步驟就不像上面寫這麼細了,觀察中序遍歷右子樹為ef,再觀察前序遍歷abcdef中右子樹

的順序為ef,所以e為a的右子樹,再觀察中序便利中e只有右邊有f,所有f為e的右子樹,最後得到的二叉樹是這個樣子的

所有求得的後序遍歷為:cdbfea

總結一下上述步驟: 先觀察前序遍歷找到根節點->觀察中序遍歷將根節點左邊歸為左子樹元素,右邊歸為右子樹元素(可能會出現只有左子樹或者右子樹的情況)->觀察前序遍歷中左\右子樹幾個元素的順序,最靠前的為左\右子樹的根節點->重複前面的步驟

第二種:已知中序遍歷、後序遍歷求前序遍歷(題還是上面這道)

中序遍歷:cbdaef

後序遍歷為:cdbfea

仍然是根據不同遍歷方式結果的特點來重構二叉樹,過程很相似這裡就不詳細說了,後序遍歷的最後乙個元素a是根節點,在中序遍歷中以根節點a作為分界將元素分為左子樹(cbd)和右子樹(ef),再觀察後序遍歷中左子樹的順序是cdb,可以判斷出b是左子樹的根節點(因為後序遍歷是:左->右->根),再觀察中序遍歷,b元素左邊是c右邊是d,說明b節點既有左子樹又有右子樹,左右子樹只有乙個元素就可以直接確定了,不用再返回去觀察後序遍歷,左子樹重建完成,

現在來看右子樹,右子樹有兩個元素ef,觀察後序遍歷e在f的後面,所以e是右子樹的根節點,然後看中序遍歷中e只有右邊乙個f元素了,即f是e的右子樹,此時整個二叉樹重構完成

總結一下上述步驟:先觀察後序遍歷找到根節點->觀察中序遍歷將根節點左邊歸為左子樹元素,右邊歸為右子樹元素(可能會出現只有左子樹或者右子樹的情況)->觀察後序遍歷中左\右子樹幾個元素的順序,最靠後的為左\右子樹的根節點->重複前面的步驟

注意:已知前序遍歷、後序遍歷無法求出中序遍歷(因為由前序後序重構出來的二叉樹不止一種)

舉個例子

左圖這兩種二叉樹前序(befa)和後序(afeb)一樣,但對應的中序遍歷結果不一樣(左邊的是afeb右邊的是befa),所以僅靠前序後序是不能重構出唯一的二叉樹。

c 二叉樹已知兩個遍歷,求另乙個遍歷

只有已知先序中序求後序 和 已知中序後序求先序兩種情況。如果已知先序後序,是不能確定中序的情況的。以下是兩種情況的 include using namespace std struct treenode void binarytreefromorderings int inorder,int pre...

已知兩種遍歷序列求原始二叉樹

思路 先序裡面,最先出現的是根節點,所以a就是根節點 中序裡面,根節點a在中間,所以a的左邊bdce是左子樹,a的右邊fhg是右子樹 先序裡面,a的左子樹b最先出現,所以b是左子樹的根節點 中序裡面,根節點b的左邊沒有結點,所以b的左子樹為空,即dce是b的右子樹 先序裡面,b的右子樹c最先出現,所...

根據兩種二叉樹遍歷方式,求二叉樹方法

如何根據已知兩種遍歷的序列,求原始的二叉樹?並不是已知道任意兩個序列都可以還原二叉樹,只有知道先序中序以及中序和後序兩種型別的遍歷順序才能還原二叉樹。只知道先序和後序是還原不了原始的二叉樹的。1 已知道先序和中序遍歷,還原二叉樹。已知道二叉樹的先序遍歷為abcdefgh,中序遍歷為bdceafhg,...