樹的儲存、森林的儲存
樹的儲存:
二叉樹的儲存:
1. 連續儲存(順序儲存)【完全二叉樹】,以陣列實現
優點:
查詢某個節點的父節點和子節點(包括判斷有沒有子節點和父節點)
缺點:
耗用記憶體空間過大
2. 鏈式儲存:
一個節點包含三個部分:左子節點地址、資料域、右子節點地址
優點:耗記憶體小
一般樹的儲存:
由於計算機的記憶體是線性的,而樹是非線性的。若在計算機裡只存樹的有效節點,便不能查詢某個節點的子節點和父節點(或者說整個樹的邏輯儲存無法知曉),所以必須要先轉化成完全二叉樹,把垃圾節點補上。
綠色的是普通樹,藍色的是轉為滿二叉樹,黃色的是去掉了底層連續的葉子節點,即成了完全二叉樹
雙親表示法:
由於樹中的每個結點都有唯一的一個雙親結點,所以可用一組連續的儲存空間(一維陣列)儲存樹中的各個結點,陣列中的一個元素表示樹中的一個結點,每個結點含兩個域,資料域存放結點本身資訊,雙親域指示本結點的雙親結點在陣列中位置(下標)。方便查詢某結點的父結點
孩子表示法:
將樹中的每個結點的孩子結點排列成一個線性表,用連結串列儲存起來。對於含有 n 個結點的樹來說,就會有 n 個單鏈表,將 n 個單鏈表的頭指標儲存在一個線性表中,這樣的表示方法就是孩子表示法。如果結點沒有孩子(例如葉子結點),那麼它的單鏈表為空表。方便查詢某結點的子節點
雙親孩子表示法:
方便查詢某結點的子節點和父節點
二叉樹表示法(孩子兄弟表示法):
把一個普通樹轉化成二叉樹來儲存,此二叉樹的根節點沒有右子樹
使用鏈式儲存結構儲存普通樹。連結串列中每個結點由 3 部分組成:
其中孩子指標域,表示指向當前結點的第一個孩子結點,兄弟指標域表示指向當前結點的下一個兄弟結點。
森林的儲存:
先把森林轉化為二叉樹,再儲存二叉樹
跟一般樹轉化為二叉樹的過程相似,把不相交的根節點視為兄弟節點