徹底理解紅黑樹

2021-09-13 10:51:34 字數 3396 閱讀 7374

在學習紅黑樹的時候,看了很多文章,發現都沒有講明白紅黑樹的原理,只是簡單列了紅黑樹的幾條規則,就開始講解紅黑樹的插入,讓人一直不知其所以然。也很難深刻的理解紅黑樹。

最後翻起了《演算法》這本書,仔細了解了二叉樹查詢樹、2-3樹、紅黑樹,才明白了紅黑樹不是平白無故產生的,而是符合科學的發展觀念是循序漸進,站在巨人的肩旁上發展起來的。

這也是我們從學生時代的填鴨式的學習方式的轉變,不僅僅是只學習結論,並且要了解結論產生的歷史及發展。

這樣我們才能從搬磚、碼農成長為工程師、科學家。

一位電腦科學的大牛說過:

程式 = 資料結構 + 演算法
資料結構是為了減少查詢、刪除的時間複雜度和空間複雜度。

![圖. 2節點 3節點]()

2節點:

3節點:

紅黑樹(平衡二叉查詢樹):節點值、節點的左子節點、節點的右子節點、節點顏色

二叉查詢樹:是由2節點的樹組成的,最壞的時間複雜度是o(n)
插入的幾種情況:

樹為空插入的節點作為根節點

插入的節點等於子樹的值,則樹不增加節點

插入的節點大於最終查詢的子樹則作為子樹的右節點

插入的節點小於最終查詢的子樹則作為子樹的左節點

根據以上的四種情況,我們可以看出,如果我們插入的值是從1開始逐漸遞增的,那麼樹就最終生長得很像鍊錶。

private noderoot = null;//根節點

private class node

}

如果查詢的值等於根節點的值,那麼查詢命中,否則遞迴的在根的子樹中(通過比較與根節點的值選擇左/右節點)查詢。

//返回null 樹中沒有此節點 ,遞迴的下左/右子節點查詢

public nodeget(t value)

if(node.value == value)else if(node.value > value)else if(node.right.value == value)

node = node.right;

}else if(node.value < value)else if(node.left.value == value)

node = node.left;}}

}

插入和查詢很像,如果樹的根節點為空(空樹)則插入到根節點,否則遞迴的在子樹中判斷,當子樹為null的時候,插入。

public nodeput(t value)

if(node.value == value)else if(node.value > value)else if(node.right.value == value)

node = node.right;

}else if(node.value < value)else if(node.left.value == value)

node = node.left;}}

}

為了解決二叉查詢樹的不平衡,2-3樹孕育而生,2-3樹能夠很好的實現樹的平衡。

2-3樹的節點不再是單一的2節點,節點可能是2節點、3節點。

2節點:有乙個值,兩個子節點

3節點:有兩個值,三個子節點。

注意二叉查詢樹是向下生長,而2-3樹是向上生長。

當2-3的根節點由3樹生長為(紅黑樹中的旋轉)2節點,樹的高度增加。

2-3樹的查詢和二叉查詢樹的思路是相同的都是迭代的思想。不過不同的是在判斷節點是否相同時2-3樹要判斷是否相等於左值或右值,如果大於左值小於右值,則從中子節點開始遞迴。

2-3樹的插入有以下幾種情況:

樹為空插入的節點作為根節點並且為2節點。

2節點中插入

插入的節點為2節點,2節點轉化為3節點。

3節點中插入

插入的節點為3節點,則臨時調整3節點為4節點(三個值),4節點中的中值變為左右值的父。

父節點為null

則4節點,轉化為3個2節點。

父為2節點

則4節點的中子轉化為父節點的值,父節點轉化為3節點。

父為3節點

則3節點的中子節點轉為父節點的值,父節點臨時轉化為4節點,此時就變成了插入的節點為3節點的情況上面的兩種情況。

通過對比,2-3和二叉樹的上圖的插入,可以看到2-3最終是會自平衡的,而二叉查詢樹最壞會變成鍊錶的形式(長的像鍊錶).

紅黑樹其實是2-3樹的一種只含2節點的表現形式。還是二叉樹節點大於左子節點,小於右子節點。

我們把2-3樹中的2節點用黑色表示,3節點用紅色表示(3節點的左節點為黑色、右節點為紅色)

將紅色鏈結畫平就是2-3樹。

每個節點要麼是紅色,要麼是黑色(2-3樹節點要麼是2節點要麼是3節點)

根節點必須是黑色

紅色節點不能連續(紅色節點的子和父不能為紅)(不能有4節點。注意2-3的4節點是臨時的)

對於每個節點,從該點至null(樹的尾端)的任何路徑,都含有相同個數的黑色節點。

左旋、右旋其實就是2-3樹的3節點臨時變為4節點,4節點的分解。

左旋右旋

把紅黑樹的插入看成是2-3樹的插入,就能明白紅黑樹的節點插入,節點的旋轉,及根據紅黑樹的

對比2-3的幾種插入情況,就能理解紅黑樹的插入情況。

乙個紅黑樹生成過程:

張無忌的回答:

建議看一下《演算法》第四版紅皮書。

其實理解紅黑樹起來也不是那麼困難。

理解紅黑樹

在樹裡面的節點不是紅色的就是黑色的,沒有其他顏色,要不怎麼叫紅黑樹呢,是吧。性質二 根節點是黑色 根節點總是黑色的。它不能為紅。性質三 每個葉節點 nil或空節點 是黑色 這個可能有點理解困難,可以看圖 這個就是乙個紅黑樹,nil節點是個空節點,並且是黑色的。性質四 每個紅色節點的兩個子節點都是黑色...

紅黑樹理解

近期讀 linux核心設計與實現 第三版 清晰中文版 發現linux低層資料結構很多都用到紅黑樹,查查資料說說自己的理解。紅黑樹 二叉樹 高度限制 二叉樹 確定了它的查詢非常快。高度限制 這個是取普通二叉樹和平衡二叉樹之間。普通二叉樹,只管插入不做調整,可能會出現單鏈很長。平衡二叉樹,所有的鏈高度相...

紅黑樹的理解

一 紅黑樹要達到自平衡的二叉樹,必須滿足下面5個性質 1 每個節點要麼是黑色,要麼是紅色。2 根節點是黑色。3 每個紅色節點的兩個子節點一定是黑色。4 任意乙個節點到每個子節點的路徑都包含相同梳理的黑節點。所以乙個節點存在乙個黑子節點,那肯定兩個子節點都是黑色 5 每次新增的新節點,都是紅色。二 紅...