1. 程式人生 > >資料結構與演算法12-樹、森林與二叉樹的轉換

資料結構與演算法12-樹、森林與二叉樹的轉換

樹和森林的二叉樹轉換

對於樹來說,在滿足樹的條件下可以是任意開頭,一個結點可以有任意多個孩子,顯然對樹的處理要複雜得多,去研究關於樹的性質和演算法,真的不容易。有沒有簡單的方法來處理樹呢?當然有啦~

前面我們提到過的樹的孩子兄弟法可以將一棵樹用二叉連結串列進行儲存,所以藉助二叉連結串列,樹和二叉樹可以相互進行轉換。從物理結構來看,它的二叉連結串列也是相同的,只是解釋不太一樣而已。因此,只要我們設定一定的規則,用二叉樹來表示樹,甚至表示森林都是可以的,森林與二叉樹也可以互相進行轉換。

樹轉換為二叉樹

將樹轉換為二叉樹的步驟如下:

1.    加線。在所有兄弟結點之間加一條連線。

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

3.    層次調整。以樹的根結點為軸心,將整棵樹順時針旋轉一定的角度,使之結構層次分明。

第一個孩子是二叉的左孩子,兄弟轉換過來的孩子是結點的右孩子

森林轉換為二叉樹

森林是由若干棵樹組成的,所以完全可以理解為,森林中的每一棵樹都是兄弟,可以按照兄弟的處理辦法來操作,步驟如下:

1.    把每個樹轉換為二叉樹。

2.    第一棵二叉樹不動,從第二棵二叉樹開始,依次把後一棵二叉樹的根結點作為前一棵二叉樹的根結點的右孩子,用線連線起來。當所有的二叉樹連線起來。當所有的二叉樹連線起來後就得到了由森林轉換來的二叉樹。

 

二叉樹轉換為樹

二叉樹轉換為樹是樹轉換為二叉樹的逆過程,也就是反過來做而已。

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

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

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

 

二叉樹轉換為森林

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

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

2.    再將每棵分離後的二叉樹轉換為樹即可。

 

樹與森林的遍歷

樹的遍歷分為兩種方式:

1.    一種是先根遍歷,即訪問樹的根結點,然後依次先根遍歷根的每棵子樹。

2.    另一種是後根遍歷,即先依次後根遍歷每棵子樹,然後再訪問根結點。

 

森林的遍歷也分兩種:

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

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