1. 程式人生 > >樹的儲存、森林的儲存

樹的儲存、森林的儲存

樹的儲存:

  二叉樹的儲存:

    1.  連續儲存(順序儲存)【完全二叉樹】,以陣列實現

      優點:

        查詢某個節點的父節點和子節點(包括判斷有沒有子節點和父節點)

      缺點:

        耗用記憶體空間過大

 

    2.  鏈式儲存:

      一個節點包含三個部分:左子節點地址、資料域、右子節點地址

      優點:耗記憶體小

 

  一般樹的儲存:

      由於計算機的記憶體是線性的,而樹是非線性的。若在計算機裡只存樹的有效節點,便不能查詢某個節點的子節點和父節點(或者說整個樹的邏輯儲存無法知曉),所以必須要先轉化成完全二叉樹,把垃圾節點補上。

 

綠色的是普通樹,藍色的是轉為滿二叉樹,黃色的是去掉了底層連續的葉子節點,即成了完全二叉樹

 

  雙親表示法:

由於樹中的每個結點都有唯一的一個雙親結點,所以可用一組連續的儲存空間(一維陣列)儲存樹中的各個結點,陣列中的一個元素表示樹中的一個結點,每個結點含兩個域,資料域存放結點本身資訊,雙親域指示本結點的雙親結點在陣列中位置(下標)。方便查詢某結點的父結點

 

 

 

  孩子表示法:

將樹中的每個結點的孩子結點排列成一個線性表,用連結串列儲存起來。對於含有 n 個結點的樹來說,就會有 n 個單鏈表,將 n 個單鏈表的頭指標儲存在一個線性表中,這樣的表示方法就是孩子表示法。如果結點沒有孩子(例如葉子結點),那麼它的單鏈表為空表。方便查詢某結點的子節點

 

 

 

 

 

雙親孩子表示法:

  方便查詢某結點的子節點和父節點

 

 

 

 

二叉樹表示法(孩子兄弟表示法):

把一個普通樹轉化成二叉樹來儲存,此二叉樹的根節點沒有右子樹

使用鏈式儲存結構儲存普通樹。連結串列中每個結點由 3 部分組成:

 

其中孩子指標域,表示指向當前結點的第一個孩子結點,兄弟指標域表示指向當前結點的下一個兄弟結點。

 

 

森林的儲存:

先把森林轉化為二叉樹,再儲存二叉樹

跟一般樹轉化為二叉樹的過程相似,把不相交的根節點視為兄弟節點