樹 森林與二叉樹相互轉換

2021-10-10 11:29:13 字數 1204 閱讀 5864

本文參考自《大話資料結構》

加線,在所有兄弟結點之間加一條連線;

去線。對樹中每個結點,只保留它與第乙個孩子結點的連線,刪除它與其他孩子結點之間的連線;

層次調整。以樹的根結點為軸心,將整棵樹順時針旋轉一定的角度,使之結構層次分明。注意第乙個孩子是二叉樹的左孩子,兄弟轉換過來的孩子是結點的右孩子。

森林由若干棵樹組成,可以理解為,每一顆樹都是兄弟。

把每棵樹轉換為二叉樹

第一棵二叉樹不動,從第二棵開始,依次把後一棵二叉樹的根結點作為前一棵二叉樹的根結點的右孩子,用線連線起來。

加線。若某結點的左孩子結點存在,則將這個左孩子的右孩子結點、右孩子的右孩子結點、右孩子的右孩子的右孩子結點…就是左孩子的n哥右孩子結點都作為此結點的孩子。將該結點與這些右孩子結點用線連線起來;

去線。刪除原二叉樹中所有結點與其右孩子結點的連線;

層次調整。使之結構層次分明

判斷一棵二叉樹能夠轉換成一棵樹還是森林,標準很簡單,就是看這棵二叉樹的根結點有沒有右孩子,有就是森林,沒有就是一棵樹。

從根結點開始,若右孩子存在,則把與右孩子結點的連線刪除,再檢視分離後的二叉樹,若右孩子存在,則連線刪除…直到所有右孩子連線都刪除,得到分離的二叉樹;

再將沒棵分離的二叉樹轉換為樹。

樹的遍歷有兩種:

先根遍歷樹,即先訪問樹的根結點,然後依次先根遍歷根的沒棵子樹;

後根遍歷,即依次後根遍歷沒棵子樹,然後再訪問根結點。

森林的2種遍歷方式:

前序遍歷:先訪問森林中第一棵樹的根結點,然後再依次先根遍歷根的每棵子樹,再依次用同樣方式遍歷除去第一棵樹的剩餘樹構成的森林;

後序遍歷:先訪問森林中第一棵樹,後根遍歷的方式遍歷沒棵子樹,然後再訪問根結點,再依次同樣方式遍歷除去第一棵樹的剩餘樹構成的森林。

分析發現,當以二叉鍊錶作為樹的儲存結構時,樹的先根遍歷和後根遍歷完全可以借用二叉樹的前序遍歷和中序遍歷演算法來實現。這也證實了,我們找到了對樹和森林這種複雜問題的簡單解決方法。

森林 樹與二叉樹相互轉換

1 森林轉二叉樹 1 把每棵樹轉換為二叉樹 2 第一棵二叉樹不動,從第二棵二叉樹開始,一次把後一棵二叉樹的根結點作為前一棵二叉樹的根結點的右孩子,用線連線起來。轉換規則 兄弟相連,長兄為父,孩子靠左。2 樹轉二叉樹 1 加線。在所有的兄弟結點之間加一條線。2 去線。樹中的每個結點,只保留它與第乙個孩...

森林 樹與二叉樹相互轉換

1 森林轉二叉樹 1 把每棵樹轉換為二叉樹 2 第一棵二叉樹不動,從第二棵二叉樹開始,一次把後一棵二叉樹的根結點作為前一棵二叉樹的根結點的右孩子,用線連線起來。轉換規則 兄弟相連,長兄為父,孩子靠左。2 樹轉二叉樹 1 加線。在所有的兄弟結點之間加一條線。2 去線。樹中的每個結點,只保留它與第乙個孩...

森林 樹與二叉樹相互轉換

1 森林轉二叉樹 1 把每棵樹轉換為二叉樹 2 第一棵二叉樹不動,從第二棵二叉樹開始,一次把後一棵二叉樹的根結點作為前一棵二叉樹的根結點的右孩子,用線連線起來。轉換規則 兄弟相連,長兄為父,孩子靠左。2 樹轉二叉樹 1 加線。在所有的兄弟結點之間加一條線。2 去線。樹中的每個結點,只保留它與第乙個孩...