二叉排序樹與紅黑樹

二叉排序樹

概念

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

(1)若左子樹不空,則左子樹上所有結點的值均小於它的根結點的值;
(2)若右子樹不空,則右子樹上所有結點的值均大於它的根結點的值;
(3)左、右子樹也分別爲二叉排序樹;
(4)沒有鍵值相等的結點。

舉例

1
2
3
5
6
7
8
9
10
11
12
13
15

這種數據結構有什麼好處?
答:便於遍歷,插入
比如我們來插入一個 14 試試:
先找根節點 9 ,比 9 大,到 13,比 13 大,到15,比15小,放15左下。
其實就是二分法查找的思想,查找所需的最大次數等同於二叉樹的高度

缺陷

100
200
300

比如現在的樹是這樣的,我們插入的數據都是1-100的數字,那麼都會插入到左邊,樹的兩邊不平衡,那麼如何變成一顆平衡二叉樹呢?有好幾種算法,其中包括AA樹、AVL樹、紅黑樹等等。今天我們重點講 紅黑樹!!

紅黑樹

紅黑樹性質

紅黑樹就是一種平衡的二叉查找樹,說他平衡的意思是他不會變成“瘸子”,左腿特別長或者右腿特別長。除了符合二叉查找樹的特性之外,還具體下列的特性:

  1. 節點是紅色或者黑色
  2. 根節點是黑色
  3. 每個葉子的節點都是黑色的空節點(NULL)
  4. 每個紅色節點的兩個子節點都是黑色的。
  5. 從任意節點到其每個葉子的所有路徑都包含相同的黑色節點。

標準紅黑樹

1
N
6
8
11
13
15
17
22
25
27
N
N
N
N
N
N
N
N
N
N

當我們在紅黑樹中插入或者刪除結點的時候,紅黑樹會被破壞,那應該怎麼辦呢?

紅黑樹的變換

主要是變色和旋轉(左、右)
比較麻煩,省略…

應用

在 C++ 的 STL 中的 map 就是用的紅黑樹,在 java 中 Tree Map 也是用的紅黑樹,也就是我們平常用的鍵值對,在函數中實現關聯數組也是用的紅黑樹,還有實時計算、圖像處理的幾何計算中也用到

人生感悟

人生像紅黑樹一樣,總是需要某種平衡

一邊是給予,一邊是接受

一邊是付出,一邊是得到

一邊是耕耘,一邊是收穫

一邊是物質,一邊是精神

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