資料結構中的樹儲存結構

2022-09-13 08:18:09 字數 3409 閱讀 2949

圖1 樹的示例

圖 1(a) 是使用樹結構儲存的集合 的示意圖。對於資料 a 來說,和資料 b、c、d 有關係;對於資料 b 來說,和 e、f 有關係。這就是「一對多」的關係。

將具有「一對多」關係的集合中的資料元素按照圖 1(a)的形式進行儲存,整個儲存形狀在邏輯結構上看,類似於實際生活中倒著的樹(圖 1(b)倒過來),所以稱這種儲存結構為「樹型」儲存結構。

結點:使用樹結構儲存的每乙個資料元素都被稱為「結點」。例如,圖 1(a)中,資料元素 a 就是乙個結點;

父結點(雙親結點)、子結點和兄弟結點:對於圖 1(a)中的結點 a、b、c、d 來說,a 是 b、c、d 結點的父結點(也稱為「雙親結點」),而 b、c、d 都是 a 結點的子結點(也稱「孩子結點」)。對於 b、c、d 來說,它們都有相同的父結點,所以它們互為兄弟結點。

樹根結點(簡稱「根結點」):每乙個非空樹都有且只有乙個被稱為根的結點。圖 1(a)中,結點a就是整棵樹的根結點。

樹根的判斷依據為:如果乙個結點沒有父結點,那麼這個結點就是整棵樹的根結點。

葉子結點:如果結點沒有任何子結點,那麼此結點稱為葉子結點(葉結點)。例如圖 1(a)中,結點 k、l、f、g、m、i、j 都是這棵樹的葉子結點。

子樹:如圖 1(a)中,整棵樹的根結點為結點 a,而如果單看結點 b、e、f、k、l 組成的部分來說,也是棵樹,而且節點 b 為這棵樹的根結點。所以稱 b、e、f、k、l 這幾個結點組成的樹為整棵樹的子樹;同樣,結點 e、k、l 構成的也是一棵子樹,根結點為 e。

注意:單個結點也是一棵樹,只不過根結點就是它本身。圖 1(a)中,結點 k、l、f 等都是樹,且都是整棵樹的子樹。
知道了子樹的概念後,樹也可以這樣定義:樹是由根結點和若干棵子樹構成的。

空樹:如果集合本身為空,那麼構成的樹就被稱為空樹。空樹中沒有結點。

補充:在樹結構中,對於具有同乙個根結點的各個子樹,相互之間不能有交集。例如,圖 1(a)中,除了根結點 a,其餘元素又各自構成了三個子樹,根結點分別為 b、c、d,這三個子樹相互之間沒有相同的結點。如果有,就破壞了樹的結構,不能算做是一棵樹。

對於乙個結點,擁有的子樹數(結點有多少分支)稱為結點的度(degree)。例如,圖 1(a)中,根結點 a 下分出了 3 個子樹,所以,結點 a 的度為 3。

一棵樹的度是樹內各結點的度的最大值。圖 1(a)表示的樹中,各個結點的度的最大值為 3,所以,整棵樹的度的值是 3。
結點的層次:從一棵樹的樹根開始,樹根所在層為第一層,根的孩子結點所在的層為第二層,依次類推。對於圖 1(a)來說,a 結點在第一層,b、c、d 為第二層,e、f、g、h、i、j 在第三層,k、l、m 在第四層。

一棵樹的深度(高度)是樹中結點所在的最大的層次。圖 1(a)樹的深度為 4。
如果兩個結點的父結點雖不相同,但是它們的父結點處在同一層次上,那麼這兩個結點互為堂兄弟。例如,圖 1(a)中,結點 g 和 e、f、h、i、j 的父結點都在第二層,所以之間為堂兄弟的關係。

如果樹中結點的子樹從左到右看,誰在左邊,誰在右邊,是有規定的,這棵樹稱為有序樹;反之稱為無序樹。

在有序樹中,乙個結點最左邊的子樹稱為"第乙個孩子",最右邊的稱為"最後乙個孩子"。
拿圖 1(a)來說,如果是其本身是一棵有序樹,則以結點 b 為根結點的子樹為整棵樹的第乙個孩子,以結點 d 為根結點的子樹為整棵樹的最後乙個孩子。

由 m(m >= 0)個互不相交的樹組成的集合被稱為

森林。圖 1(a)中,分別以 b、c、d 為根結點的三棵子樹就可以稱為森林。

前面講到,樹可以理解為是由根結點和若干子樹構成的,而這若干子樹本身是乙個森林,所以,樹還可以理解為是由根結點和森林組成的。用乙個式子表示為:

tree =(root,f)

其中,root 表示樹的根結點,f 表示由 m(m >= 0)棵樹組成的森林。

除了圖 1(a)表示樹的方法外,還有其他表示方法:

圖2 樹的表示形式

圖 2(a)是以巢狀的集合的形式表示的(集合之間絕不能相交,即圖中任意兩個圈不能相交)。

圖 2(b)使用的是凹入表示法(了解即可),表示方式是:最長條為根結點,相同長度的表示在同一層次。例如 b、c、d 長度相同,都為 a 的子結點,e 和 f 長度相同,為 b 的子結點,k 和 l 長度相同,為 e 的子結點,依此類推。

最常用的表示方法是使用廣義表的方式。圖 1(a)用廣義表表示為:

(a , ( b ( e ( k , l ) , f ) , c ( g ) , d ( h ( m ) , i , j ) ) )
樹型儲存結構類似於家族的族譜,各個結點之間也同樣可能具有父子、兄弟、表兄弟的關係。本節中,要重點理解樹的根結點和子樹的定義,同時要會計算樹中各個結點的度和層次,以及樹的深度。

前面講過,陣列即可以儲存不可再分的資料元素(如數字 5、字元 'a'),也可以繼續儲存陣列(即 n 維陣列)。

但需要注意的是,以上兩種資料儲存形式絕不會出現在同乙個陣列中。例如,我們可以建立乙個整形陣列去儲存 ,我們也可以建立乙個二維整形陣列去儲存 ,},但陣列不適合用來儲存類似 } 這樣的資料。

有人可能會說,建立乙個二維陣列來儲存}。在儲存上確實可以實現,但無疑會造成儲存空間的浪費。
對於儲存 } 這樣的資料,更適合用廣義表結構來儲存。

廣義表,又稱列表,也是一種線性儲存結構。

同陣列類似,廣義表中既可以儲存不可再分的元素,也可以儲存廣義表,記作:

ls = (a1,a2,…,an)
其中,ls 代表廣義表的名稱,an 表示廣義表儲存的資料。廣義表中每個 ai 既可以代表單個元素,也可以代表另乙個廣義表。

原子和子表

通常,廣義表中儲存的單個元素稱為 "原子",而儲存的廣義表稱為 "子表"。

例如建立乙個廣義表 ls = },我們可以這樣解釋此廣義表的構成:廣義表 ls 儲存了乙個原子 1 和子表 。

以下是廣義表儲存資料的一些常用形式:

注意,a = () 和 a = (()) 是不一樣的。前者是空表,而後者是包含乙個子表的廣義表,只不過這個子表是空表。

當廣義表不是空表時,稱第乙個資料(原子或子表)為"表頭",剩下的資料構成的新廣義表為"表尾"。

強調一下,除非廣義表為空表,否則廣義表一定具有表頭和表尾,且廣義表的表尾一定是乙個廣義表。
例如在廣義表中 ls=,5} 中,表頭為原子 1,表尾為子表 和原子 5 構成的廣義表,即 ,5}。

再比如,在廣義表 ls = 中,表頭為原子 1 ,但由於廣義表中無表尾元素,因此該錶的表尾是乙個空表,用 {} 表示。

強調一下,除非廣義表為空表,否則廣義表一定具有表頭和表尾,且廣義表的表尾一定是乙個廣義表。

資料結構之樹的儲存結構

樹是一種一對多的資料結構,這個一對多很好解釋,就比如乙隻狗媽媽,會有多隻小奶狗,這不就有一對多的意思嗎!樹的根節點有且只有乙個,就比如小奶狗們只有乙個親狗媽。那麼圖上的 b c d e 都是樹的根節點 a 的孩子 總之,樹就是有很多結點構成,只不過這些結點在樹中會有不同的稱呼,來分析一下下圖 度 結...

《資料結構》樹的儲存結構2019 10 15

定義 1 只有乙個根結點 2 其餘結點為幾個不相交的有限集,他們本身也是一棵樹,且被稱為根的子樹。樹的定義就用到了遞迴的方法。幾個概念 結點的度 該結點擁有的子樹的數量 葉結點 度為0的結點 樹的度 結點度的最大值 層次 根結點為第一層,其孩子為第二層,以此類推。深度 結點的最大層數 高度 數量和深...

資料結構(C語言)樹的儲存結構

1 雙親表示法 實現 定義結構陣列,存放樹的結點,每個結點包含兩個域 資料域 存放結點本身資訊 雙親域 指示本結點的雙親結點在陣列中的位置 陣列下標 data parent0r 11a0 2b03 c04d 15e1 6f37 h68h 69k6 特點 找雙親容易,找孩子難 實現 typedef s...