1. 程式人生 > >關於樹及其各種操作

關於樹及其各種操作

對樹的知識進行整理,圖片來自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)替代。