結合不同的遍歷方式(前 中 後)重建二叉樹

2021-09-27 08:28:45 字數 1431 閱讀 9118

嘗試根據結果結合不同的遍歷方式重建二叉樹

總結二叉樹遍歷分為前序遍歷中序遍歷後序遍歷。(網上有很多相關資料,所以本文只會簡單提一下,以便整篇內容的理解)

輸出根節點

前序遍歷左子樹

前序遍歷右子樹

中序遍歷左子樹

輸出根節點

中序遍歷右子樹

後序遍歷左子樹

後序遍歷右子樹

輸出根節點

應該有人在面試時被問過:三種不同的遍歷方式,取其中兩種,哪種結合方式可以逆推出二叉樹,哪種結合方式不能。

答案是:

前序 + 中序 √

中序 + 後序 √

前序 + 後序 ×

所以很多文章都說三種遍歷方式中中序遍歷更重要是有其道理的。

接下來我們根據測試用例分別根據三種不同的結合方式進行模擬。

測試用例:

前序輸出:1 2 4 5 7 3 6

中序輸出:4 2 7 5 1 3 6

後序輸出:4 7 5 2 6 3 1

根據前序規則尋找根節點,可知根節點在資料第一位,為 1

根據中序規則可知,根節點左邊資料為左子樹、右邊資料為右子樹,所以得出左子樹(4 2 7 5)根節點(1)右子樹(3 6)

將 2 步得出的左子樹和右子樹分別進行 1、2 步的流程,最終即可確定一顆唯一的樹

總結流程就是前序用來找根節點,中序用得到的根節點劃分左右子樹,遞迴得出二叉樹。

根據後序規則尋找根節點,可知根節點在資料最後一位,為 1

根據中序規則可知,根節點左邊資料為左子樹、右邊資料為右子樹,所以得出左子樹(4 2 7 5)根節點(1)右子樹(3 6)

將 2 步得出的左子樹和右子樹分別進行 1、2 步的流程,最終即可確定一顆唯一的樹

總結流程就是後序用來找根節點,中序用得到的根節點劃分左右子樹,遞迴得出二叉樹。

區別於前兩種組合,當前組合中的前序和後序可以確定二叉樹的根,但都不能確定剩餘資料是在左子樹還是右子樹中,導致無法逆推出乙個唯一的樹。

如下二叉樹,都可以得出前序和後序滿足的輸出,但樹不相同:

這是由於,當二叉樹某個節點只有乙個子節點的時候,無論這個節點是左子節點還是右子節點,對於前序和後序遍歷的結果是沒有影響的。

所以只根據前序 + 後序無法逆推出乙個唯一的二叉樹。

本文簡單描述了二叉樹的三種遍歷規則,並解釋了為什麼前序 + 中序、中序 + 後序可以逆推出唯一的二叉樹,而前序 + 後序就不行,希望對你有所幫助。

重建二叉樹 前中遍歷 後中遍歷

乙個二叉樹的遍歷序列不能決定一棵二叉樹,但某些不同的遍歷序列組合可以唯一確定一棵二叉樹。給定一棵二叉樹的前序遍歷序列和中序遍歷序列可以唯一確定一棵二叉樹的結構,給定一棵二叉樹的後序遍歷序列和中序遍歷序列也可以唯一確定一棵二叉樹的結構。注意 這還有乙個條件 二叉樹的任意兩個結點的值都不相同。一.根據前...

二叉樹的遍歷(前中後)

總體來說分為遞迴和非遞迴實現 前序遍歷 二叉樹前序遍歷dlr public static void preorder treenode rootnode 前序非遞迴實現,借助棧,先進後出 param public static void preordernonrecursive treenode r...

樹的遍歷,前中後 層次遍歷非遞迴

存在記憶體洩漏,原因是沒有銷毀結點時記憶體釋放的處理.include include include include using namespace std class cbtnode typedef cbtnode btnode class cbtroot void xianxubianli1 遞...