數據結構(二十六)樹、森林與二叉樹的轉換

  1、樹、森林與二叉樹轉換的意義算法

  二叉樹因爲每一個結點最多隻能有左孩子和右孩子,而在樹中一個結點能夠包括任意數目的子結點,所以二叉樹的不少性質和算法被研究了出來。若是全部的樹都向二叉樹同樣方便就行了。樹與二叉樹、森林與二叉樹之間能夠相互轉換,並且這種轉換是一一對應的。blog

  2、樹轉換爲二叉樹隊列

  爲了操做方便,假設樹是一棵有序樹,也就是說將樹中每個結點的孩子按從左到右的順序進行編號,二叉樹

  將樹轉換爲二叉樹的步驟爲:遍歷

  • 加線:將樹中全部相鄰的兄弟之間加一條連線。
  • 去線:將樹中的每個結點,只保留它與第1個孩子結點之間的連線,刪去它與其餘孩子結點之間的連線。
  • 旋轉:以樹的根結點爲軸心,將整棵樹順時針旋轉必定的角度並作適當的調整,使之結構分明。

  

  由轉換過程可知,樹與由它轉換成的二叉樹是一一對應的,樹中的任意一個結點都對應着二叉樹中的每個結點,樹中每個結點的第1個孩子結點在二叉樹中是對應結點的左孩子,而樹中每一結點的右鄰兄弟在二叉樹中是對應結點的右孩子(E的右鄰兄弟是F,因此F是E的右孩子;F的右鄰兄弟是G,因此G是F的右孩子)。也就是說,在二叉樹中,左分支上的每一個結點在原來的樹中是父子關係,而右分支上的各個結點在原來的樹中是兄弟關係。因爲樹中的根結點沒有兄弟,因此由樹轉換成的二叉樹永遠都是一顆根結點的右子樹爲空的二叉樹。im

  3、二叉樹轉換爲樹d3

  二叉樹轉換爲樹是樹轉換爲二叉樹的逆過程,具體步驟爲:db

  • 加線:若某結點是其雙親結點的左孩子,則將該結點沿着右分支向下的全部結點(該結點的右孩子結點,右孩子結點的右孩子結點,...)與該結點的雙親結點用線鏈接。
  • 刪線:將樹中全部雙親結點與右孩子結點的連線刪除。
  • 旋轉:以樹的根結點爲軸心,將整棵樹逆時針旋轉必定的角度並作適當的調整,使之結構分明。

  

  4、森林轉換爲二叉樹img

  森林是若干棵樹的集合,而任何一顆和樹對應的二叉樹的右子樹必定爲空,則能夠獲得將森林轉換爲二叉樹的步驟爲:集合

  • 把每棵樹轉換爲二叉樹
  • 按照森林中樹的前後順序,將後一棵二叉樹視爲前一棵二叉樹的右子樹依次鏈接,從而構成一顆二叉樹

  

  5、二叉樹轉換爲森林

  判斷一顆二叉樹可以轉換成一顆樹仍是森林,只要看這棵二叉樹的根結點有沒有右孩子,若是有右孩子就是森林,沒有右孩子就是一棵樹。二叉樹轉換爲森林的步驟爲:

  • 從根結點開始,若右孩子存在,則把右孩子結點的連線刪除,再查看分離後的二叉樹,若右孩子存在,則把右孩子結點的連線刪除...直到全部右孩子連線都刪除爲止
  • 將每棵分離後的二叉樹轉換爲樹

  

  6、樹的遍歷

  樹能夠被當作由樹的根結點和根結點的全部子樹所構成的森林兩部分構成,所以樹的遍歷操做主要有前序遍歷、後序遍歷和層次遍歷三種方式。

  1.前序遍歷:

  若樹爲非空,則

  • 訪問根結點
  • 從左到右依次先序遍歷根結點的每一棵子樹

  2.後序遍歷

  若樹爲非空,則

  • 從左到右依次後序遍歷根結點的每一棵子樹
  • 訪問根結點

  3.層次遍歷

  若樹爲非空,則

  • 從上到下依次訪問每一層的各個結點,在同一層中的結點,則按從左到右的順序依次進行訪問(使用隊列實現)。

  

  • 前序遍歷:ABEFCDG
  • 後序遍歷:EFBCGDA
  • 層次遍歷:ABCDEFG

  7、森林的遍歷

  森林也能夠當作是由第一棵樹的根結點、第一棵樹的根結點的子樹所構成的森林和除第一棵樹以外的其他樹所構成的森林三部分構成。

  1.前序遍歷

  若森林爲非空,則

  • 訪問森林中第一棵樹的根結點
  • 前序遍歷第一棵樹中根結點的子樹所構成的森林
  • 前序遍歷森林中除第一棵樹以外的其餘樹所構成的森林

  2.後序遍歷

  若森林爲非空,則

  • 後序遍歷第一棵樹中根結點的子樹所構成的森林
  • 訪問森林中第一棵樹的根結點
  • 後序遍歷森林中除第一棵樹以外的其餘樹所構成的森林

  3.層次遍歷

  若森林爲非空,則

  • 按從左到右的順序對森林中的每一棵樹進行層次遍歷

  

  • 前序遍歷:ABCDEFGHJI
  • 後序遍歷:BCDAFEJHIG
  • 層次遍歷:ABCDEFGHIJ
相關文章
相關標籤/搜索