【C++】 ——紅黑樹的旋轉(詳細圖解+附C++代碼)

1、紅黑樹的概念

  • 紅黑樹是一棵二叉搜索樹
  • 所有的左孩子都小於根結點,右孩子都大於根結點
  • 紅黑樹是一棵基本平衡的樹(左右高度差不超過1)
  • 紅黑樹最大深度小於等於最小深度的二倍

2、紅黑樹的性質

性質:
(1)每個節點是紅色或者黑色
(2)根結點是黑色
(3)所有葉節點是黑色
(4)紅節點的孩子必須是黑節點,所有的葉節點都是空節點
(5)從一個節點到它所有葉子節點的路徑中,黑節點的個數是相相同的

其實關於性質三,我們可以推理出:所有從上到下的路徑中,不能有兩個連續的紅節點,但可以有兩個連續的黑節點。從紅黑樹的性質5中,可以推理出“紅黑樹最大深度小於等於最小深度的2倍”。因爲對於任何一個節點來說,比如它到左孩子葉節點共經歷了5個黑節點,那麼它到右孩子葉節點一定也是經歷了5個黑節點,經歷5個黑節點能夠做到的最大深度是多少呢?因爲性質3,不能偶有兩個連續的紅節點,所以最大深度一定是紅黑相間的,就可以做到最大深度爲10,所以說“紅黑樹最大深度小於等於最小深度的二倍

3、紅黑樹的插入

其實插入的話,我們首先得思考一個問題,你插入的默認顏色是RED還是BLACK?這裏我們需要根據性質來思考,如果首先插入的是黑節點,這個可以直接插入,但是就會違揹我們的性質5,每條路徑黑色節點的數量就會不一樣了。調整起來就會比較繁瑣,所以插入節點一定要爲紅色

(1)情況一:插入的cur爲紅,parent爲紅,grandparent爲黑,uncle存在且爲紅。

如下圖:
在這裏插入圖片描述
此時我們所做的一個操作就是把parent和uncle的顏色變爲黑,grandparent的結點變爲紅,這樣我們就保證了該子樹中每條路徑中黑色節點數量相同,並且沒有連續的紅色節點

(2)情況二:cur爲紅,parent爲紅,grandparent爲黑,uncle不存在或者uncle爲黑,那這時候我們就要進行旋轉操作(這裏面還包括四種情況:到底是進行左單旋還是右單旋)。

當parent爲grandparent的左孩子,cur爲parent的左孩子則進行右單旋,然後修改顏色;第一種情況uncle不存在,如圖:
在這裏插入圖片描述
第二種情況uncle存在且爲黑:
在這裏插入圖片描述
第三種情況:parent爲grandparent的右孩子,cur爲parent的右孩子,進行左單旋轉。
以下是uncle不存在

在這裏插入圖片描述
情況四,uncle存在且爲黑,如圖:
在這裏插入圖片描述

(3)情況三:cur爲紅,parent爲紅,grandparent爲黑,uncle存在或者uncle爲黑色。進行雙旋

如圖是uncle存在且爲黑色
在這裏插入圖片描述
所做的處理是進行左右單旋,然後調整顏色:
在這裏插入圖片描述
第二種形態:
在這裏插入圖片描述
所做的處理時進行右左單旋
在這裏插入圖片描述

4、紅黑樹的代碼實現

鏈接在這裏:紅黑樹C++代碼
希望廣大網友提出建議,一定虛心採納!

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