樹、森林、以及二叉樹之間的轉化
樹和二叉樹的轉換
樹和二叉樹是兩種不同的數據結構,樹實現起來比較麻煩,但是樹可以轉換爲二叉樹進行處理,處理完以後再從二叉樹還原爲樹。
下面說說轉換的方法:
1. 樹轉換爲二叉樹
(1) 樹中所有相同雙親結點的兄弟結點之間加一條連線。
(2) 對樹中不是雙親結點第一個孩子的結點,只保留新添加的該結點與左兄弟結點之間的連線,刪去該結點與雙親結點之間的連線。
(3) 整理所有保留的和添加的連線,使每個結點的第一個孩子結點連線位於左孩子指針位置,使每個結點的右兄弟結點連線位於右孩子指針位置。
如下是樹轉換爲二叉樹的過程示例圖:
分爲三個步驟:
-
兄弟+橫線
樹中的每一個結點,如果該結點有兄弟結點,那麼就在這幾個兄弟結點之間進行連線。 -
保存長子線
對於樹中的每一個結點,如果其有多個子節點,保存其第一個子節點的連線,去除其他子節點的連線。 -
調整位置
對每個結點調整一定的位置,使其符合二叉樹的標準。
案例:
將上圖中的樹轉化爲二叉樹
第一步:兄弟+橫線
第二步:保留長子線
第三步:調整位置,橫線變斜線
2. 二叉樹還原爲樹
(1) 若某結點是其雙親結點的左孩子,則把該結點的右孩子、右孩子的右孩子……都與該結點的雙親結點用線連起來。
(2) 刪除原二叉樹中所有雙親結點與右孩子結點的連線。
(3) 整理所有保留的和添加的連線,使每個結點的所有孩子結點位於相同層次高度。
如下是二叉樹還原爲樹的過程示意圖:
(由於我自己太懶了,圖沒有自己畫,以上圖片來自百度圖片搜索)
森林轉二叉樹
森林轉二叉樹分爲三個步驟
將每課樹轉換成二叉樹
將每課樹的根結點連接起來
把每棵樹的根當做兄弟結點處理,兄弟加橫線
旋轉調整位置
案例:
將上述森林轉化爲二叉樹
第一步:每課樹都轉化爲二叉樹
第二步:根節點橫線連接
第三步:調整位置,橫線變斜線
二叉樹轉化爲樹、森林
二叉樹轉化樹
一般分三個步驟:
若某結點的左孩子結點存在,將左孩子結點的右孩子結點、右孩子結點的右孩子結點……都作爲該結點的孩子結點,將該結點與這些右孩子結點用線連接起來;
刪除原二叉樹中所有結點與其右孩子結點的連線;
調整位置
二叉樹轉化森林
三步:
- 先把每個結點與右孩子結點的連線刪除,得到分離的二叉樹;
- 把分離後的每棵二叉樹轉換爲樹;
- 調整位置
注:在考研試題當中,一般很少會單獨考這個知識點,一般會將這個知識點與二叉樹的前序、中序、後序遍歷結合,與樹和森林的先根、後根遍歷相結合。