一、樹(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樹
紅黑數。