簡單理解紅黑樹

2021-10-20 23:58:53 字數 1470 閱讀 5718

前言

在計算機領域,資料的處理能力是非常重要的,查詢作為一種對資料處理乙個很重要的能力,我們就先來看看今天要說的紅黑樹

查詢說到查詢我們很快就能想起來很多常用的查詢方式,比如說遍歷,二分查詢,雜湊等,其中我們知道雜湊在一定情況下可以達到o(1)的時間複雜度,速度可謂是非常之快,但是他也有他的缺點就是不能範圍查詢,所以我們就來說說今天要說的紅黑樹。

二叉查詢樹

說到紅黑樹,我們不得不先說一下二叉查詢樹,因為紅黑樹是在他的基礎上建立的,下圖就是一顆二叉查詢樹

他有著以下特點

左子樹的上的值永遠小於或等於右子樹上的數

右子樹上的值永遠大於左子樹上的值

左右子樹同樣也是一顆二叉查詢樹

但是,問題來的,在一些特殊情況下會出現下圖的狀況,他的結構接近鍊錶,時間複雜度接近o(n),

紅黑樹怎麼樣上圖的情況不會發生呢,我們引入了紅黑樹,我們先來看一下紅黑樹的特點

每個結點不是紅色就是黑色

他的根結點是黑色

不可能出現兩個紅色連線在一塊的情況,但是兩個黑色節點可以

每個紅色結點的兩個結點都是黑色

但是當插入新的結點時,這種平衡就會被打破,所以我們需要一些操作來保證他的平衡——變色和旋轉

變色和旋轉

變色:就是把紅色節點變為黑色,或者把黑色節點變為紅色

旋** 分為左旋和右旋

左旋:逆時針旋轉紅黑樹的兩個節點,使得父節點被自己的右孩子取代,而自己成為自己的左孩子

右旋: 順時針旋轉紅黑樹的兩個節點,使得父節點被自己的左孩子取代,而自己成為自己的右孩子

其中,紅黑樹的變色和旋轉作是乙個非常複雜的的過程,下來我們就來說乙個常見的過程

變色規則時插入的都為紅色的結點

變顏色的情況:當前結點的父親時紅色,且他的祖父結點的另乙個結點也是紅色(叔叔結點)

把父親結點變為黑色

把父親的結點的父親結點變為紅色色(爺爺結點)

把指標定義到祖父結點設為當前要操作的變化的點

左旋當前父節點時紅色,叔叔結點是黑色的時候,且當前的結點是左子樹。左旋以父節點作為左旋

右旋當前父節點是紅色,叔叔是黑色的時候,且當前結點是左子樹,右旋

把父節點變為黑色

把祖父結點變為紅色

10.以祖父結點旋轉

理解紅黑樹

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

紅黑樹理解

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

徹底理解紅黑樹

在學習紅黑樹的時候,看了很多文章,發現都沒有講明白紅黑樹的原理,只是簡單列了紅黑樹的幾條規則,就開始講解紅黑樹的插入,讓人一直不知其所以然。也很難深刻的理解紅黑樹。最後翻起了 演算法 這本書,仔細了解了二叉樹查詢樹 2 3樹 紅黑樹,才明白了紅黑樹不是平白無故產生的,而是符合科學的發展觀念是循序漸進...