程式猿必修課之資料結構(十)樹1

2021-08-21 08:26:20 字數 2919 閱讀 8891

樹是一對多的資料結構

樹(tree)是 n (n ≥ 0)個結點的有限集。

n = 0 時,稱為空樹。

在任意一棵非空樹中:

其實樹的定義用到了遞迴的方法。

樹的每乙個結點包含乙個資料元素和若干個指向其子樹的分支。

結點的度:結點擁有的子樹的個數稱為結點的度(degree)。

度為 0 的結點稱為葉結點(leaf)終端結點

度不為 0 的結點稱為非終端結點分支結點

除根結點之外,分支結點也稱為內部結點

樹的度:樹內各結點的度的最大值。

下圖中,結點度的最大值是結點 d 的度為 3,所以樹的度也為 3。

結點的層次(level)從根開始,根為第一層。

樹中結點的最大層次稱為樹的深度高度,上圖中樹的深度為 4。

如果把樹中各子樹看成從左到右是有序的,不能互換的,則稱該樹為有序樹,否則稱為無序樹

森林:m (m ≥ 0)棵互不相交的樹的集合。

線性結構

樹結構第乙個資料元素:無前驅

最後乙個資料元素:無後繼

中間元素:乙個前驅乙個後繼

根結點:無雙親,唯一

葉結點:無孩子,可以多個

中間結點:乙個雙親,多個孩子

樹的儲存結構的3種表示方法:雙親表示法、孩子表示法、孩子兄弟表示法。

用一組連續空間儲存樹的結點,同時每個結點包含資料域和乙個指向其雙親的指標域。

結點 :

data

parent

其中 data 是資料域,儲存結點的資料資訊。而 parent 是指標域,儲存該結點的雙親在陣列中的下標。由於根結點沒有雙親,所以我們約定根結點的位置域設定為 - 1,這樣所有的結點就都儲存了它的雙親的位置了。

二叉樹( binary tree) 是 n(n ≥ 0) 個結點的有限集合,該集合或者為空集(稱為空二叉樹),或者由乙個根結點和兩棵互不相交的、分別稱為根結點的左子樹和右子樹的二叉樹組成 。

每個結點最多有兩棵子樹,所以二叉樹中不存在度大於2的結點。注意:不是只有兩棵子樹,而是最多。沒有子樹或者有一棵子樹都是可以的。

左子樹和右子樹是有順序的,次序不能任意顛倒。

即使樹中某結點只有一棵子樹,也要區分是左子樹還是右子樹。如下圖:樹 1 和 樹 2 是同一棵樹,但它們卻是不同的二叉樹。

空二叉樹。

只有乙個根結點。

根結點只有左子樹。

根結點只有右子樹。

根結點既有左子樹又有右子樹。

斜樹

所有的結點都只有左子樹的二叉樹叫左斜樹;所有結點都只有右子樹的二叉樹叫右斜樹。左斜樹和右斜樹統稱為斜樹。斜樹有很明顯的特點:就是每一層都只有乙個結點,結點的個數與二叉樹的深度相同。

滿二叉樹

在一棵二叉樹中,如果所有分支結點都存在左子樹和右子樹,並且所有葉子都在同一層上,這樣的二叉樹稱為滿二叉樹。

滿二叉樹的特點:

1) 葉子只能出現在最下一層。

2) 非葉子結點的度一定是 2。

3) 在同樣深度的二叉樹中,滿二叉樹的結點個數最多,葉子數最多。

完全二叉樹

對一棵具有 n 個結點的二叉樹按層次編號,如果編號為 i (1≤ i ≤ n) 的結點與同樣深度的滿二叉樹中編號為 i 的結點在二叉樹中位置完全相同,則這棵二叉樹稱為完全二叉樹。

完全二叉樹的特點:

1)葉子結點只能出現在最下兩層。

2)最下層的葉子一定集中在左邊連續位置。

3)倒數第二層,若有葉子結點,一定都在右邊連續位置。

4)如果結點度為 1,則該結點只有左孩子,不存在只有右孩子的情況。

5)同樣結點數的二叉樹,完全二叉樹的深度最小。

在二叉樹的第 i 層上至多有 2i-1 個結點(i ≥ 1)。

深度為 k 的二叉樹至多有 2 k - 1個結點(k ≥ 1)。

具有 n 個結點的完全二叉樹的深度為 ⌊ log2n ⌋ + 1 (⌊x⌋ 表示不大於 x 的最大整數)。

順序儲存結構

二叉樹的順序儲存結構就是用一維陣列儲存二叉樹中的結點,並且結點的儲存位置,也就是陣列的下標要能體現結點之間的邏輯關係。

將一棵完全二叉樹用順序儲存結構儲存。

將這棵二叉樹存入到陣列中,相應的下標對應其同樣的位置

對於一般的二叉樹,可以將其按完全二叉樹編號,把不存在的結點設定為「^」 就可以了。

但是當一棵深度為 k 的右斜樹,它只有 k 個結點,卻要分配 2k -1 個儲存單元,這樣對儲存空間造成浪費。所以,順序儲存結構一般只用於完全二叉樹

二叉鍊錶

二叉樹每個結點最多有兩個孩子,所以每個結點包含乙個資料域和兩個指標域,這樣的鍊錶叫做二叉鍊錶。

其中 data 是資料域,lchild 和 rchild 都是指標域,分別存放左孩子和右孩子的指標。

程式猿必修課之資料結構(七)棧2

斐波那契 fibonacci 是乙個經典的遞迴例子。數字 1,1,2,3,5,8,13.構成乙個序列,它的特點是 前面相鄰兩項之和是後一項的值。用數學函式來定義是 斐波那契數列 用遞迴實現列印出前 40 位的斐波那契數列數的 如下 includeint fbi int int main return...

程式猿必修課之資料結構(八)佇列

佇列 queue 是只允許在一端進行插入操作,而在另一端進行刪除操作的線性表。佇列是一種先進先出 first in first out 的線性表,簡稱fifo。允許插入的一端稱為隊尾,允許刪除的一端稱為隊頭。佇列是特殊的線性表,因此它的各種操作類似線性表,不同的是插入資料只能在隊尾進行,刪除資料只能...

程式猿必修課之資料結構(三)線性表1

線性表 list 零個或多個資料元素的有限序列。首先它是乙個序列。也就是說,元素之間是有順序的,若存在多個元素,則第乙個元素無前驅,最後乙個元素無後繼,其他每個元素都有且只有乙個前驅和後繼。其次,線性表強調是有限的。線性表元素的個數 n n 0 定義為線性表的長度,當 n 0 時,稱為空表。adt ...