紅黑樹的原理 關於紅黑樹原理的一些介紹

2021-10-12 08:06:36 字數 2848 閱讀 9791

紅黑樹(red black tree)是一種重要的資料結構,也經常會用到,c++的map就是使用紅黑樹來實現的。在程式設計師找工作的面試中,紅黑樹也是經常被問到的乙個知識點,我也是當時從找工作的時候嘗試去理解紅黑樹的一些結構和原理,但是由於找工作時間比較緊張,而且要了解的知識點比較多,所以當時對它也沒有更深入的了解,後來入職後也擱置了,最近利用一些時間嘗試去讀懂紅黑樹的一些知識,這裡全當做個總結吧。

紅黑樹的優勢是相對於普通的二叉查詢樹(binary search tree)來說的, 理想情況下,時間複雜度為o(logn)。

瘸腿的二叉樹

這種情況的二叉樹,他的左子節點均為空,二叉樹退化成了鍊錶,這樣查詢的時間複雜度為o(n)。為了避免這種情況的出現,因此提出了二叉平衡樹的概念。紅黑樹就是一種二叉平衡樹,它保證二叉樹的最大分支高度不超過最小分支高度的兩倍(高度概念是二叉樹中的乙個概念,沒獲取一次子節點,高度+1)。

紅黑樹是一種自平衡的二叉查詢樹,除了滿足二叉查詢樹的性質外,還需要滿足如下五個條件:

1. 節點是紅色或黑色

2. 根節點為黑色

3. 所有葉子節點都是黑色

4. 每個紅色節點都必須有兩個黑色的子節點

5. 從任一節點到葉子節點的所有路徑都包含相同數目的黑色節點

red = 0

black = 1

class rbtreenode

def __init__(self, value, parent, left, right, color):

self.parent = parent

self.left = left

self.right = right

self.value = value

self.color = color

紅黑樹的基本操作有三個,分別是變色、左旋和右旋,紅黑樹的插入、刪除、查詢、遍歷動作都可以找到這三個基本操作的影子,首先介紹這三個基本操作。

變色操作比較簡單,不改變該節點的值以及該節點在紅黑樹中的位置,僅改變該節點的顏色,紅黑樹顏色有兩種,所以,變色分為兩種,紅色變為黑色和黑色變為紅色

對值為4的節點做左旋操作,就是將4節點的右子節點6節點上公升,4節點作為6節點的左子節點,原6節點的左子節點作為4節點的右節點

對值為6的節點做右旋操作,就是將6節點的左子節點4節點上公升,6節點作為4節點的右子節點,原4節點的右子節點作為6節點的左子節點

def rotate_left(self):

self.left.parent = self.parent

self.left.right = self

self.left = self.self.right

self.parent = self.left

從根節點查詢某元素是否存在與紅黑樹中,採用的方法與普通的二叉查詢樹相同,因為二叉查詢樹的性質,所以小於的往左找,大於的往右找,等於的話就找到了,否則找到葉子節點也沒找到,那就說明該元素不存在於二叉樹中

def find(self, element):

if self.value == element:

return self

if element < self.value:

if self.left is none:

return none

return self.left.find(element)

else:

if self.right is none:

return none

return self.right.find(element)

對於插入和後續的刪除動作,需要注意紅黑樹的上面5條規則不被打破,其中規則1、規則2和規則3都比較容易滿足,重點要保證規則4和規則5在插入後依然滿足。我參考其他貼子的時候(包括維基百科),上來就提到如果刪除的節點有兩個葉子節點的話,可以轉化為刪除的節點最多只有乙個葉子節點的情況,然後巴拉巴拉就只介紹如何刪除最多乙個葉子節點的節點。我當時看完就感覺一頭霧水,大概這就是學渣和大神的距離吧。哈哈,不扯廢話了,下面是正經的。

在刪除節點時,當待刪除的節點有兩個非空子節點時,首先找到右子樹的最小元素(或者左子樹的最大元素),然後把右子樹最小元素的值替換原待刪除節點的值,之後待刪除元素就是右子樹的最小元素了,右子樹的最小元素最多只有乙個子節點,那麼接下來就轉化為了刪除只有乙個或0個非空子節點的情況了.......

不清楚讀者看到上面一段話讀完什麼感受,我覺得還是有必要再解釋一下,究竟怎麼做的,以及為什麼可以這麼做。

用下面乙個例子看一下究竟是怎麼做的

紅黑樹原理

若左子樹不為空,則左子樹上所有節點的值都小於根節點的值 若右子樹不為空,則右子樹上所有節點的值都大於根節點的值 且左右子樹都為二叉搜尋樹 查詢 必須從根節點開始查詢 如果值比根節點大則查詢右子樹,否則左子樹,直到找到節點 插入 與查詢類似 逐個節點對比,直到找到滿足條件的null,就插入到相應位置 ...

紅黑樹核心原理

紅黑樹是一種近似平衡的二叉查詢樹,它能夠確保任何乙個節點的左右子樹的高度差不會超過二者中較低那個的一陪。具體來說,紅黑樹是滿足如下條件的二叉查詢樹 binary search tree 每個節點要麼是紅色,要麼是黑色。根節點必須是黑色 紅色節點不能連續 也即是,紅色節點的孩子和父親都不能是紅色 對於...

紅黑樹的原理,雙紅缺陷,雙黑缺陷

引入紅黑樹的目的是為了實現在維護bst平衡的同時,盡量控制拓撲結構調整的次數,即最好做到每次動態操作後只有o 1 次的拓撲調整。紅黑樹的規則 1 樹根必須是黑色 2 外部節點必須為黑色 3 其餘節點 紅節點只能有黑孩子,即不能出現相鄰的父子兩代都為紅色 4 外部節點到根 所有外部節點的黑深度相同。在...