數據結構專題——樹

一、樹(Tree)

定義(參考維基百科: http://en.wikipedia.org/wiki/Tree_%28data_structure%29):

A tree is a (possibly non-linear) data structure made up of nodes or vertices and edges without having any cycle. The tree with no nodes is called the null or empty tree. A tree that is not empty consists of a root node and potentially many levels of additional nodes that form a hierarchy.

(分析(非空樹關鍵特點):結點間連線不構成循環(從根結點到其他結點的路徑有且只有一條);有且僅有一個根結點。

圖形表示:


術語:(參考《大話數據結構》及維基百科)

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------

根結點 Root:The top node in a tree.

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------

結點間關係:

孩子/孩子結點/子結點 Child:一個結點含有的子樹的根結點稱爲該結點的孩子結點/子結點。 

雙親/父親結點/父結點 Parent: 若一個結點含有子結點,則這個結點稱爲其子結點的父結點。(子結點與父結點相對應) 

兄弟/兄弟結點 Siblings:具有相同父結點的結點互稱兄弟結點。

堂兄弟/堂兄弟結點 :父結點在同一層且不同的結點互稱爲堂兄弟結點。(堂兄弟和兄弟相對應)

結點的祖先 Ancestor:從根結點到該結點所經分支上的所有結點都稱爲該結點的祖先。

結點的子孫 Descendant:以該結點爲根的子樹中的所有結點都稱爲該結點的子孫。(子孫與祖先相對應)

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------

單個結點特徵:

結點的度 Degree:結點擁有的子樹數稱爲結點的度。(注意:這些子樹的根結點都是該結點的子結點,而不是該結點的所有子孫)

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

葉結點/終端結點/外部結點 Leaf / External node:度爲0的結點。

分支結點/非終端結點/內部結點 Branch / Internal node:度不爲0的結點。

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------

樹特徵:

結點的層次 Level:The level of a node is defined by 1 + the number of connections between the node and the root.

樹的深度/高度 Depth:樹中結點的最大層次。

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

無序樹 / 自由樹:樹中任意結點的子結點之間沒有順序關係。

有序樹:樹中任意結點的子結點之間有順序關係。

--------------------------------------------------------------------------------------------

-------------------------------------------------------------------------------

樹的表示:

  順序存儲結構(數組);

  鏈式存儲結構(鏈表);

--------------------------------------------------------------------------------------------

-------------------------------------------------------------------------------

樹的遍歷:

1.前序遍歷

2.中序遍歷

3.後序遍歷

1)廣度遍歷

2)深度遍歷

二、二叉樹(Binary Tree)

定義:是個有限元素的集合,該集合或者爲空、或者由一個稱爲根(root)的元素及兩個不相交的、被分別稱爲左子樹和右子樹的二叉樹組成。當集合爲空時,稱該二叉樹爲空二叉樹。

注意:二叉樹是有序的:區分左子樹和右子樹

性質:

(1)一棵非空二叉樹,第 i 層上最多有 2^(i - 1) 個結點(i ≥ 1)。

(2)一棵深度爲 k 的二叉樹,最多具有 (2^k-1) 個結點。

(3)一棵非空的二叉樹,如果葉子結點數爲n0,度數爲2 的結點數爲n2,則有n0 = n2 + 1。

滿二叉樹(Full Binary Tree):深度爲k,且有2^k-1個結點的二叉樹。

三、完全二叉樹(Complete Binary Tree)

定義:若二叉樹的深度爲h,則除第 h 層外,其它各層 (1~h-1) 的結點數都達到最大個數,第 h 層所有的結點都連續集中在最左邊。

性質(完全二叉樹採用數組tree(順序存儲結構)實現,初始下標爲1,對樹中的結點按從上至下、從左到右的順序進行編號,數組長度(結點個數)爲n):

(1)若i爲奇數且i > 1,那麼結點i左兄弟爲tree[i - 1];

(2)若i爲偶數且i < n,那麼結點i右兄弟爲tree[i + 1];

(3)若i > 1,結點i雙親爲tree[i / 2],否則i = 1,結點i爲根結點,無雙親;

(4)若2 * i <= n,那麼結點i的左孩子爲tree[2 * i],否則無左孩子;若2 *i + 1 <= n,那麼結點i的右孩子爲tree[2 * i + 1],否則無右孩子;

(5)若i > (n / 2),那麼tree[i]爲葉子結點(對應於(3));

(6)若i < ((n-1) / 2),那麼tree[i]必有兩個孩子(對應於(4))。

(7)滿二叉樹一定是完全二叉樹,完全二叉樹不一定是滿二叉樹。

(8)具有n 個結點的完全二叉樹,深度k 爲[log2n] + 1。

四、二叉查找樹 Binary Search Tree  《算法導論》有開闢一章詳細介紹

其他名詞:二叉排序樹,二叉搜索樹

性質:對於任何一個結點X
若它的左子樹非空,則左子樹上所有結點的值均小於等於X的值;
若它的右子樹非空,則右子樹上所有結點的值均大於等於X的值;

特點:(設二叉查找樹高度爲h)

按中序遍歷二叉查找樹,所得到的中序遍歷序列是一個遞增(或遞減)的有序序列,時間複雜度O(n)。

操作:

1.查找時間複雜度:O(h),有遞歸版本和迭代版本。

2.尋找最大值、最小值時間複雜度:O(h)。

3.前驅和後繼:(中序遍歷下的前驅和後繼)時間複雜度:O(h)。

4.插入和刪除:

插入:時間複雜度:O(h)

刪除:注意:刪除結點後要保持中序遍歷是一個相對不變的序列。

刪除分情況討論:

1.如果Z沒有孩子,直接刪除,僅僅修改其父結點P[Z]的孩子爲NIL即可。

2.如果Z僅僅只有一個孩子,那麼刪除Z之前要把Z的孩子賦值給其父母P[Z]的孩子(左|右)。這樣一個拉鍊直接去刪除Z了。

3.如果Z有兩個孩子,這樣就有點麻煩了。因爲刪除Z之後還有兩個孩子,如果不好好處理會破壞二叉樹的性質,我們刪除Z一定要保持中序遍歷的相對位置序列不變。


其他:

B樹:B-tree

AVL樹

紅黑數。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章