上一章:程序猿必修課之數據結構(九)串
你還在為開發中頻繁切換環境打包而煩惱嗎?快來試試 Environment Switcher 吧!使用它可以在app運行時一鍵切換環境,而且還支持其他貼心小功能,有了它媽媽再也不用擔心頻繁環境切換了。https://github.com/CodeXiaoMai/EnvironmentSwitcher
樹是一對多的數據結構
樹的定義
樹(Tree)是 n (n ≥ 0)個結點的有限集。
n = 0 時,稱為空樹。
在任意一棵非空樹中:
- 有且僅有一個特定的根(root)結點。
- 當 n > 1 時,其余結點可分為 m (m > 0) 個互不相交的有限集,其中每一個集合本身又是一棵樹,并且稱之為根的子樹(SubTree)。
其實樹的定義用到了遞歸的方法。
常用名詞概念
樹的每一個結點包含一個數據元素和若干個指向其子樹的分支。
結點的度:結點擁有的子樹的個數稱為結點的度(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 層上至多有 2 i-1 個結點(i ≥ 1)。
- 深度為 k 的二叉樹至多有 2 k - 1個結點(k ≥ 1)。
- 具有 n 個結點的完全二叉樹的深度為 ? log2n ? + 1 (?x? 表示不大于 x 的最大整數)。
二叉樹的存儲結構
順序存儲結構
二叉樹的順序存儲結構就是用一維數組存儲二叉樹中的結點,并且結點的存儲位置,也就是數組的下標要能體現結點之間的邏輯關系。
將一棵完全二叉樹用順序存儲結構存儲。
將這棵二叉樹存入到數組中,相應的下標對應其同樣的位置
對于一般的二叉樹,可以將其按完全二叉樹編號,把不存在的結點設置為“^” 就可以了。
但是當一棵深度為 K 的右斜樹,它只有 k 個結點,卻要分配 2k -1 個存儲單元,這樣對存儲空間造成浪費。所以,順序存儲結構一般只用于完全二叉樹。
二叉鏈表
二叉樹每個結點最多有兩個孩子,所以每個結點包含一個數據域和兩個指針域,這樣的鏈表叫做二叉鏈表。
其中 data 是數據域,lchild 和 rchild 都是指針域,分別存放左孩子和右孩子的指針。