樹的儲存結構
樹的存貯結構有多種表示方法,比較典型的乃是順序結構和鍊錶結構兩類。
順序存貯結構即向量,一般將樹結點按自上而下,自左至右的順序一一存放。如前文所介紹的完全二叉樹就可以採用順序存貯結構。
1.雙親鍊錶表示法
順序儲存結構常用的有雙親表示法,這種方法在每個陣列元素中存放某個結點資訊和該結點的雙親下標值。
(1)雙親鍊錶表示法的實現
方法① 用動態鍊錶實現
方法② 用向量表示——更為方便
(2)雙親鍊錶表示例項
【例】如圖6.13(a)所示這棵一般樹,它的雙親陣列表示法,如圖6.13(b)所示。
(a)分析:e和f所在結點的雙親域是3,它們的雙親結點在向量中的位置是3,即c是它們的雙親。
注意:① 根無雙親,其parent域為-1。
② 雙親鍊錶表示法中指標parent向上鏈結,適合求指定結點的雙親或祖先(包括根);求指定結點的孩子或其它後代時,可能要遍歷整個陣列。
2.多重鍊錶的孩子表示法
(1) 結點結構
① 定長結點
即樹中每個結點均按樹的度k來設定指標。
n個結點的樹一共有n*k個指標域,而樹中只有n-1條邊,故樹中的空指標數目為
kn-(n-1)=n(k-1)+1(k越大,浪費的空間越多)。
②不定長結點
即樹中每個結點按本結點的度來設定指標數,並在結點中增設乙個度數域degree指出該結點包含的指標數。
各結點不等長,雖然節省了空間,但是給運算帶來不便。
(2)孩子鍊錶表示法
孩子鍊錶表示法是為樹中每個結點設定乙個孩子鍊錶,並將這些結點及相應的孩子鍊錶的頭指標存放在乙個向量中。
(3)孩子鍊錶表示法例項
【例】圖 6.13 所示的樹是乙個三叉樹,可用三重鍊錶來存貯,其結點結構為:有乙個資料域和三個指標域,指標域用於指向該結點的各個孩子。該樹的三重鍊錶如圖 6.14 ( a )所示。如果面對一棵分叉很多的樹,這種方法就會更加複雜。
注意:① 孩子結點的資料域僅存放了它們在向量空間的序號。
② 與雙親鍊錶表示法相反,孩子鍊錶表示便於實現涉及孩子及其子孫的運算,但不便於實現與雙親有關的運算。
③ 將雙親鍊錶表示法和孩子鍊錶表示法結合起來,可形成雙親孩子鍊錶表示法。
3.孩子兄弟鍊錶表示法
(1)表示方法
樹最常用的是孩子 - 兄弟二叉鍊錶表示法,這種方法表示規範,不僅適用於多叉樹的儲存,也適用於森林的儲存。構成孩子 - 兄弟二叉鍊錶的結點結構是:乙個資料域和兩個指標域,乙個指標指向它的長子,另一指標指向它的乙個兄弟。
(2)表示例項
【例】圖 6.13 中樹的孩子 - 兄弟二叉鍊錶結構如圖 6.14(b) 所示。假設把圖 6.14(b) 中指向兄弟的水平方向指標改為下斜 45 ℃ ,不難發現它與一棵二叉樹十分相似。二叉樹結構規範、簡單並具有一些重的要性質,因此常將一般樹結構轉換為二叉樹結構進行處理。
注意:這種儲存結構的最大優點是:它和二叉樹的二叉鍊錶表示完全一樣。可利用二叉樹的演算法來實現對樹的操作。
樹的儲存結構
樹的資料邏輯結構是一對n的,除了根節點,每個元素只有乙個前驅,但是可以有多個後繼,具有層次關係,像家譜就是乙個樹的例子。樹是有n個結點的有限集合,當n大於零時,這個樹有且僅有乙個稱為根的結點,從根節點延申出來的元素可以時n個,同時可以再延申。n 0時,該樹就是空樹。樹的第一層就是根結點,第二層都是稱...
樹的儲存結構
1 第一行乙個n,代表這個樹有n個節點,接下來輸入n行,第i行輸入兩個數字,li,ri,代表第i個節點的左兒子右兒子 節點序號從1編號到n 如果沒有左兒子或者右兒子,就用 1代替,輸出它的層序遍歷 include include include using namespace std struct ...
樹的儲存結構
一 樹的儲存結構有三種 1.雙親表示法 2.孩子表示法 3.孩子兄弟表示法 二 雙親表示法 用一組連續空間儲存樹的結點,同時在每乙個結點中增加乙個指示器,用來標記雙親的位置。方便尋找雙親 不放便查詢孩子 孩子表示法 資料區不再是雙親的節點位置 而是此雙親的左右孩子 左右分支均是儲存的本結點的孩子 若...