關於樹及其各種操作
對樹的知識進行整理,圖片來自COMP20003。
首先樹(tree)並不一定都是二叉樹(binary tree),這裡主講二叉樹。
二叉樹:
二叉樹:即1個節點(node)至多有2個子節點(child node)。
遍歷(traversal):
分3種:前序遍歷(Pre-order traversal)、中序遍歷(In-order traversal)、後序遍歷(Post-order traversal)。
前序遍歷(Pre-order traversal):拷貝樹
順序為中左右。
中序遍歷(In-order traversal):按序輸出
順序為左中右。
predecessor:在中序排列中一個節點的前一個節點,稱為該節點的predecessor,從二叉樹圖上可以看出是一個節點左子樹中最右邊的節點。
successor:在中序排列中一個節點的後一個節點,稱為該節點的successor,從二叉樹圖上可以看出是一個節點右子樹中最左邊的節點。
後序遍歷(Post-order traversal):刪除(free)樹
順序為左右中。
實現:使用遞迴(recursion)
完全二叉樹(complete binary tree):除了最下層,其餘層的節點都有2個節點,而最下層的節點只能在最左邊的二叉樹。
完全二叉樹的特性:
n個節點的完全二叉樹,它的深度(depth)或高度(height)大約(approximately)是log2n,注意:height和depth均是從0
二叉搜尋樹(binary search tree):一個節點的值比它左邊連結的子節點們的值都大(或等於),比它右邊連線的子節點們都小(或等於)的二叉樹,最差情況是插入的值是已經按順序排好的,此時樹變成了stick,實際上成了連結串列。
AVL樹(名字來源於發明者的首字母):每個節點的左右子樹的高度(height)差的絕對值<=1的二叉樹,當高度差>1時,則要進行旋轉(rotation)操作保持平衡(keep balanced,即所有左右子樹的高度差的絕對值<=1)。
保持平衡(keep balanced):
在每個節點邊上寫上高度差,從下往上看,從首先看到絕對值大於1的節點進行操作,分為兩種情況:
Single Rotation(符號相同):
LL:Right Rotation
RR:Left Rotation
Double Rotation(符號不同):
RL:先Right Rotation,再Left Rotation
LR:先Left Rotation,再Right Rotation
樹的旋轉(Rotation):
分為左旋鑽(Left Rotation),右旋轉(Rigth Rotation)。
節點刪除(deletion from bst):
共2步:1.找到該節點。2.刪除該節點。如何找很簡單,但找到後刪除還要將該節點的葉子接上去(如果有)。刪除節點分為3中情況:
1:該節點是葉子節點(無child),直接刪除。
2:該節點僅有一個child(左或右),用該child替代。
3:該節點有2個children。
3a:其中一個children沒有child,用該節點替代。
3b: 2個children都有child,用中序排列中目標節點的前一個(predecessor)或後一個(successor)替代。