樹:數據結構基礎筆記

二叉排序樹

二叉排序樹(Binary Sort Tree),又稱二叉查找樹(Binary Search Tree),亦稱二叉搜索樹。

定義:

一棵空樹,或者是具有下列性質的二叉樹:
(1)若左子樹不空,則左子樹上所有結點的值均小於它的根結點的值;
(2)若右子樹不空,則右子樹上所有結點的值均大於它的根結點的值;
(3)左、右子樹也分別爲二叉排序樹;
(4)沒有鍵值相等的結點。
在這裏插入圖片描述

插入結點:

二叉排序樹是一種動態樹表。其特點是:樹的結構通常不是一次生成的,而是在查找過程中,當樹中不存在關鍵字等於給定值的結點時再進行插入。新插入的結點一定是一個新添加的葉子結點,並且是查找不成功時查找路徑上訪問的最後一個結點的左孩子或右孩子結點。

刪除結點:

在二叉排序樹刪去一個結點,分三種情況討論:
1.刪除結點爲葉子結點,也就是無左右子樹;
2.刪除結點只有左子樹或右子樹;
3.刪除結點左右子樹均不爲空。
參考文章:二叉查找樹 - 刪除節點 詳解(Java實現)

平衡二叉查找樹

它是一棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,並且左右兩個子樹都是一棵平衡二叉樹。在平衡二叉搜索樹中,我們可以看到,其高度一般都良好地維持在O(log2n),大大降低了操作的時間複雜度。

調整平衡的基本思想:

當在平衡二叉排序樹中插入一個節點時,首先檢查是否因插入而破壞了平衡,若破壞,則找出其中的最小不平衡二叉樹,在保持二叉排序樹特性的情況下,調整最小不平衡子樹中節點之間的關係,以達到新的平衡。
所謂最小不平衡子樹,指離插入節點最近且以平衡因子的絕對值大於1的節點作爲根的子樹。
先插入指定節點,記錄下當前節點的信息,LH,EH或者RH。

  1. 若左子樹高LH,查看其左子樹根節點的信息,若是LH,則一次右旋;若是RH,則一次左旋+一次右旋
  2. 若右子樹高RH,查看右子樹根節點的信息,若是RH,則一次左旋;若是LH,則一次右旋+一次左旋
  3. 調整改變的節點信息

追求絕對的高度平衡,隨着樹的高度的增加,動態插入和刪除的代價也隨之增加。

紅黑樹

紅黑樹(Red Black Tree) 是一種自平衡二叉查找樹 。二叉查找樹這一數據結構並不難,而紅黑樹之所以難是難在它還是自平衡的二叉查找樹,在進行插入和刪除等可能會破壞樹的平衡的操作時,需要重新自處理達到平衡狀態。

紅黑樹的性質:

紅黑樹是一種含有紅黑結點並能自平衡的二叉查找樹。它必須滿足下面性質:
性質1:每個節點要麼是黑色,要麼是紅色。
性質2:根節點是黑色。
性質3:每個葉子節點(NIL)是黑色。
性質4:每個紅色結點的兩個子結點一定都是黑色。
性質5:任意一結點到每個葉子結點的路徑都包含數量相同的黑結點。
從性質5又可以推出:
性質5.1:如果一個結點存在黑子結點,那麼該結點肯定有兩個子結點
在這裏插入圖片描述

紅黑樹的其他操作方法及原理參考圖文文章:漫畫:什麼是紅黑樹 和文章:30張圖帶你徹底理解紅黑樹 還有文章:淺析紅黑樹(RBTree)原理及實現

B樹、B-樹

B-樹就是B樹。英文名字叫做B-tree,中間的短線是英文連接符,只是翻譯的時候將短線翻譯成了減號。
全稱Balance-tree(平衡多路查找樹),平衡的意思是左邊和右邊分佈均勻。多路的意思是相對於二叉樹而言的,二叉樹就是二路查找樹,查找時只有兩條路,而B-tree有多條路,即父節點有多個子節點。

B-樹用途:

使用B-tree結構可以顯著減少定位記錄時所經歷的中間過程,從而加快存取速度。這個數據結構一般用於數據庫的索引,綜合效率較高。

定義:

階的概念:階定義爲一個節點的子節點數目的最大值。
(1)樹中每個結點至多有m 棵子樹(注:m指的是樹的階);
(2)若根結點不是葉子結點,則至少有兩棵子樹(注:根節點至少有兩個兒子);
(3)除根結點之外的所有非葉子結點至少有p個子節點;
(4)所有的非葉子結點中包含以下數據:(n,A0,K1,A1,K2,…,Kn,An)
其中:
1. Ki(i=1,2,…,n)爲關鍵碼,且Ki<Ki+1(注:ki是真實數據,存放在線性表當中,且從左至右升序排列)
2. Ai 爲指向兒子的指針(i=0,1,…,n),且指針Ai-1 所指子樹中所有結點的關鍵碼均小於Ki (i=1,2,…,n),An 所指子樹中所有結點的 關鍵碼均大於Kn。(注:每個ki數據兩旁各安放了一個指針,即Ai-1和Ai,左邊的子樹數據統統小於ki,右邊子樹的數據統 統大於ki)(注:總體來看指針數量比數據數量多1)
3. n 爲關鍵碼的個數(\left \lceil m/2 \right \rceil-1\leqslant n\leqslant m-1)。
(5)所有的葉子結點都出現在同一層次上,即所有葉節點具有相同的深度,等於樹高度。並且不帶信息(可以看作是外部結點或查找失敗的結點,實際上這些結點不存在,指向這些結點的指針爲空)。
在這裏插入圖片描述

更多詳情和操作參考文章:B-樹(B樹)

B+樹

B+樹是基於B-樹的一種變體,有着比B-樹更高的查詢性能。

定義:

一個m階的B+樹具有如下幾個相較於B-樹的新特徵:
1.有k個子樹的中間節點包含有k個元素(B樹中是k-1個元素),每個元素不保存數據,只用來索引,所有數據都保存在葉子節點。
2.所有的葉子結點中包含了全部元素的信息,及指向含這些元素記錄的指針,且葉子結點本身依關鍵字的大小自小而大順序鏈接。
3.所有的中間節點元素都同時存在於子節點,在子節點元素中是最大(或最小)元素。
在這裏插入圖片描述
更多概念理解參考圖文文章:b+樹圖文詳解

B+樹的實現參考文章:B+樹的Java實現(B+ Tree)

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