樹、森林與二叉樹的轉化
樹和森林的遍歷
雙親表示法
這種方式利用一組連續的儲存空間來儲存每乙個節點。同時在每乙個節點增加乙個偽指標,用來記錄其雙親節點在陣列中的位置。
根結點下標為0,偽指標域為-1。如圖:雙親表示法
孩子表示法
孩子表示法是將每個結點的孩子結點都用單鏈表鏈結起來形成乙個線性結構。
n個孩子就會有n個孩子鍊錶。
葉子結點的孩子鍊錶為空表。
如下圖是孩子表示法:與雙親表示法是同一顆樹。
孩子兄弟表示法
孩子兄弟表示法又稱二叉樹表示法,即以二叉鍊錶作為儲存結構。
每個節點包含三部分內容:結點值,指向結點第乙個孩子結點的指標,指向結點下乙個兄弟結點的指標(沿此域可以找到結點的所有兄弟結點)。
如下圖:與上面表示的都是一棵樹
(左邊是第乙個孩子結點,右邊是兄弟結點)
優點:可以方便地實現樹轉化為二叉樹的操作,易於查詢孩子結點等。
缺點:從當前結點查詢其雙親結點比較麻煩。
若為每個結點增設乙個parent域只想其父結點,則查詢父結點也變得很方便。
樹轉化為二叉樹
轉化規則:
「左孩子,右兄弟」
每個結點左指標指向它的第乙個孩子,
右指標指向它在樹中的相鄰的右兄弟。
畫法:1、在兄弟結點之間加一連線
2、對每個結點,只保留它與第乙個孩子的連線,與其他孩子的連線全抹掉
3、以樹根為軸心,順時針旋轉45度。
森林轉換為二叉樹
規則:與樹類似。
先將森林中的每棵樹轉化為二叉樹,每棵二叉樹的右子樹必空,若把第二棵樹根結點是為第一課樹根的右兄弟,即將第二棵樹對應的二叉樹當作第一棵二叉樹根的右子樹,第三棵樹對應的二叉樹當作第二棵樹對應子樹的右子樹,以此類推,可以將森林轉化為二叉樹。
畫法:1、將森林中的每棵樹轉化為相應的二叉樹
2、每棵樹的根視為兄弟關係,在每棵樹的根之間加一根連線
3、以第一棵樹的根為軸心旋轉45度
二叉樹轉換為森林
規則:若二叉樹非空,則二叉樹的根以及左子樹為第一棵樹的二叉樹形式,故將根的右鏈斷開。用同樣的方法,知道最後只剩一棵沒有右子樹的的二叉樹為止,將每棵二叉樹一次轉換成樹就得到了原森林。
二叉樹轉換為樹或森林是唯一的。
樹的遍歷
1、先根遍歷
先訪問根結點,再一次訪問子樹
遍歷序列與這棵樹對應的二叉樹的先序序列相同
2、後根遍歷
先依次遍歷子樹,再訪問根結點
遍歷序列與這棵樹對應的二叉樹的中序序列相同
森林的遍歷
1、先序遍歷森林
訪問森林中第一棵樹的根結點
先序遍歷第一棵樹中根結點的子樹森林
先序遍歷出去第一棵樹之後剩餘的樹構成的森林
遍歷序列與森林對應的二叉樹的先序序列相同
2、中序遍歷森林
中序遍歷森林中第一棵樹的根結點的子樹森林
訪問第一棵樹的根結點
中序遍歷出去第一棵樹之後剩餘的樹構成的森林
遍歷序列與森林對應的二叉樹的中序序列相同
樹和森林的遍歷與二叉樹遍歷的對應關係樹森林
二叉樹先根遍歷
先序遍歷
先序遍歷
後根遍歷
中序遍歷
中序遍歷
樹 森林 以及二叉樹之間的轉化
二叉樹轉化為樹 森林 樹和二叉樹是兩種不同的資料結構,樹實現起來比較麻煩,但是樹可以轉換為二叉樹進行處理,處理完以後再從二叉樹還原為樹。下面說說轉換的方法 1 樹中所有相同雙親結點的兄弟結點之間加一條連線。2 對樹中不是雙親結點第乙個孩子的結點,只保留新新增的該結點與左兄弟結點之間的連線,刪去該結點...
樹和二叉樹 森林 線索二叉樹
1 三叉鍊錶 在二叉鍊錶的基礎上增加了乙個指向雙親的指標域。2 三叉鍊錶的結點資料型別宣告 templatestruct node 3 樹 二叉樹 1.兄弟加線。2.保留雙親與第一孩子連線,刪去與其他孩子的連線。3.順時針轉動,使之層次分明。樹的前序遍歷等價於二叉樹的前序遍歷!樹的後序遍歷等價於二叉...
樹轉化為二叉樹 森林轉化為二叉樹(詳解版)
前面介紹了普通樹轉化為二叉樹的孩子兄弟表示法,本節來學習如何將森林轉化為一整棵二叉樹。森林,指的是由 n n 2 棵互不相交的樹組成的集合,如圖 1 所示。在某些實際場景中,為了便於操作具有森林結構的資料,往往需要將森林轉化為一整棵二叉樹。我們知道,任意一棵普通樹都可以轉化為二叉樹,而森林是由多棵普...