紅黑樹():

1. 紅黑樹:

紅黑樹從根節點開始的最長的路徑不會超過最短路徑的2倍。

紅黑樹的話,他的結點的分布沒有我們的AVL樹的結點的分布均衡,但是效率也不錯,AVL樹的結點分布的那么均勻,其實也是在進行了旋轉,付出了代價換來的絕對的均衡。

那么紅黑樹的“紅黑樹從根節點開始的最長的路徑不會超過最短路徑的2倍”是怎么被維持的呢?

這兩個是我們的紅黑樹,第一個紅黑樹的左邊全黑的路徑就是最短路徑,右邊一黑一紅的是最長的路徑,最長路徑<=最短路徑的2倍;

那我們來數一下我們的這兩個紅黑樹的路徑有多少跳呢?

我們的第一個紅黑樹的路徑有8條,第二個有10條。(我們數路徑一定要數到空結點,我們的第一個二叉樹的10結點下面還有兩個空的結點)

這個二叉樹不是我們的紅黑樹,他的最短的路徑是最左邊的,只有一個黑節點,但是我們的右邊的最長的路徑有兩個黑節點,這就不符合我們的紅黑樹的規則。

最短和最長路徑:

在我們的紅黑樹里面,全黑的那條路徑就是最短的路徑,一紅一黑的路徑是最長的路徑;

紅黑樹沒有AVL樹那樣的絕對的平衡,但是效率也不錯,紅黑樹的旋轉次數更少;

2. 紅黑樹的插入:

我們給紅黑樹里面插入新節點的時候,我們可以是插入黑色結點,也可以是插入紅色結點,但是如果插入黑色結點的話,這個黑色結點影響了這條路徑的黑色結點的數量,我們的每條路徑的黑色結點的數量可能都會發生變化來保持他們每條路徑的黑色結點的數量的相等,這個是很難控制的。

所以我們必須要插入紅色結點,當然,如果這個樹連根都沒有的話,根節點要求是黑結點,我們就插入一個黑結點。

uncle結點的情況的劃分:

插入紅結點,我們的叔叔結點分為三種情況,我們先看第三種情況:uncle結點存在且為紅:

uncle結點存在且為紅:

看這個圖片,當我們給parent結點的下面插入一個紅結點的時候,這時候我們的parent結點和cur結點都是我們的紅色的結點,(因為我們的紅黑樹的規則說明,我們是不能有兩個紅色結點同時在的)。

常規的處理辦法:(變色)

這時候我們看我們的uncle結點,uncle結點是紅色結點,這時候我們就把parent結點和uncle結點都變成黑色結點,然后把grandparent結點變成紅色結點。(這個就是我們一般變色的方法)。

這時候我們看我們的圈出來的部分就變正常了,然后每條路徑的黑色結點的數量也是一樣的。但是出現了新的問題,那就是我們的紅黑樹又出現了兩個紅色結點連接的情況。

這時候我們就再來一次我們剛才的操作,我們把之前的grandparent結點看成我們的新的cur結點,然后找到新的parent,uncle,grandparent結點。

這時候我們重復剛才的操作,我們看我們的uncle結點,這個時候的話,我們的uncle結點就來到了我們的第二種情況,那就是我們的uncle結點存在且為黑色節點。

我們的第二種的uncle結點存在且為黑色結點的這種情況的話,他只會出現在我們的下面的子樹的根節點由黑色變成紅色上來的,不然的話,直接插入紅色結點的話,uncle結點是不可能為黑色的,不然不符合紅黑樹的規定。

就好比這種情況,我們給插入一個紅色結點后,紅色結點cur的叔叔結點uncle直接就是黑色結點,這種情況要是有的話,說明這個紅黑樹還沒有插入結點的時候,這就是一個錯誤的紅黑樹。

這種情況只會是我們變了一層以后,繼續的往上面去找,然后再往上層的uncle可能會有的情況;

我們往回來看:

uncle結點存在且為黑:

我們現在的叔叔uncle結點現在是黑色結點,這時候我們的剛才的常規的處理的方法就不行了,但是我們還是要想辦法來處理他,因為他的最長了路徑已經超過了我們的最短路徑的長度了。

這時候我們的剛才的常規的變色的處理方法已經不夠用了,我們這時候就要使用旋轉來解決了。

旋轉的話,我們分為單旋和雙旋,我們看情況使用這兩個旋轉方式。

旋轉:

//這個是我們的單旋:

我們看這個,這時候我們的uncle結點為黑色結點,我們的兩個紅色結點相連接,左邊的結點比較冗余,我們就進行一個右單旋,parent結點作為我們的根節點,然后grandparent結點變成紅色結點作為我們的parent結點的右孩子結點。

//核心是旋轉完后我們把parent結點的顏色變成黑色,然后把grandparent結點的顏色變成紅色。

下面的是我們的雙旋:

旋轉的話,我們已經比較熟悉了,我們看上面的,我們要把cur結點作為我們的最上面的結點,我們把cur的左孩子作為parent的右孩子,然后把cur的右孩子變成grandparent的左孩子。

旋轉結束以后,我們的cur結點就變成了我們的這顆樹的根,這個節點有可能是我們的整棵樹的根節點,也有可能只是一個子樹的根,但是不管怎樣,我們都把cur結點的colour置為BLACK。

然后把grandparent的colour置為RED。????????

uncle結點不存在:

當我們的uncle結點不存在的話,我們的cur結點一定是新增的,不可能是由下面的黑結點演變過來的,因為當我們的uncle結點不存在的時候,我們的parent這邊的話,他是不能有黑色結點的,所以不可能是演變來的。

這種情況的話,我們是一定要想辦法處理掉的,因為后面的路徑有兩個紅結點是相連的,并且的這條路徑已經超過了我們的最短路徑的長度。?

這時候我們的變色就解決不了這個問題了,我們就要使用旋轉來解決;

這個是我們的單旋:

比如上面的這個,我們就使用一個右單旋就可以解決,然后把我們的parent結點變成黑色結點,然后grandparent結點變成紅色結點,parent有可能是整顆紅黑樹的根,也有可能只是一顆普通紅黑樹的子樹的根,但是最后我們都要把它置為黑節點。

下面的是我們的雙旋:

這個紅黑樹沒有uncle結點,然后他是左邊高的右邊高,我們就要使用一個雙旋來解決,使用一個左右雙旋來解決。(我們之前學習的雙旋,我們可以靈巧的記憶一下,我們的cur結點要做到我們的最高的結點,然后cur結點的左孩子給parent的右孩子,cur結點的右孩子做成我們的grandparent的左孩子)。

總結:

這個是我們的uncle結點為紅結點,并且parent和uncle結點變成黑節點,grandparent結點變紅結點之后就可以處理掉的情況。

這個是我們的uncle結點是空結點的情況,我們需要使用旋轉來處理。

這個是我們的uncle結點先是紅結點,parent和uncle結點變黑,grandparent結點變紅之后,但是我們的紅黑樹還是有問題的,這時候我們的常規的(parent,uncle,grandparent)變色已經解決不了了,我們就得旋轉來解決了。

我們總結一下:我們的上面的三個圖片就是對應了我們的uncle結點的三種情況;

紅黑樹的插入的代碼的實現:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/82546.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/82546.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/82546.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【AI智能推薦系統】第六篇:隱私保護與聯邦學習在推薦系統中的平衡之道

第六篇:隱私保護與聯邦學習在推薦系統中的平衡之道 提示語:?? “數據不出域,推薦更精準!深度揭秘騰訊、螞蟻集團如何用聯邦學習打造合規推薦系統,隱私計算技術全景解析與工業級實現方案!” 目錄 隱私保護的行業挑戰隱私計算技術體系 2.1 聯邦學習基礎架構2.2 差分隱私…

【Qt/C++】深入理解 Lambda 表達式與 `mutable` 關鍵字的使用

【Qt/C】深入理解 Lambda 表達式與 mutable 關鍵字的使用 在 Qt 開發中&#xff0c;我們常常會用到 lambda 表達式來編寫簡潔的槽函數。今天通過一個實際代碼示例&#xff0c;詳細講解 lambda 的語法、變量捕獲方式&#xff0c;特別是 mutable 的作用。 示例代碼 QPushButto…

記錄 ubuntu 安裝中文語言出現 software database is broken

搜索出來的結果是 sudo apt-get install language-pack-zh-han* 然而,無效,最后手動安裝如下 apt install language-pack-zh-hans apt install language-pack-zh-hans-base apt install language-pack-gnome-zh-hans apt install fonts-arphic-uming apt install libreoffic…

[虛幻官方教程學習筆記]深入理解實時渲染(An In-Depth Look at Real-Time Rendering)

原英文教程地址深入理解實時渲染&#xff08;An In-Depth Look at Real-Time Rendering&#xff09; 文章目錄 1.Intro to An In-Depth Look at Real-Time RenderingCPU VS GPUDeferred VS Forward 2. Before Rendering and OcclusionCulling計算的步驟使用console command:fre…

Linux進程間信號

目錄 信號入門 生活角度中的信號 技術應用角度的信號 信號的發送與記錄 信號處理常見方式概述 產生信號 通過終端按鍵產生 通過系統函數向進程發信號 由軟件條件產生信號 由硬件異常產生信號 阻塞信號 信號其他相關常見概念 在內核中的表示 sigset_t 信號集操作…

Git簡介和發展

Git 簡介 Git是一個開源的分布式版本控制系統&#xff0c;跨平臺&#xff0c;支持Windows、Linux、MacOS。主要是用于項目的版本管理&#xff0c;是由林納斯托瓦茲(Linux Torvalds)在2005年為Linux內核開發而創建。 起因 在2002年至2005年間&#xff0c;Linux內核開發團隊使…

Perspective,數據可視化的超級引擎!

Perspective 是一個強大的交互式數據分析和可視化庫&#xff0c;它允許你創建高度可配置的報告、儀表板、筆記本和應用程序。給用戶提供了一個新的視角來看待數據。 Stars 數9125Forks 數1217 主要特點 高效流式查詢引擎&#xff1a;Perspective使用C編寫&#xff0c;并編譯為…

MySQL COUNT(*) 查詢優化詳解!

目錄 前言1. COUNT(*) 為什么慢&#xff1f;—— InnoDB 的“計數煩惱” &#x1f914;2. MySQL 執行 COUNT(*) 的方式 (InnoDB)3. COUNT(*) 優化策略&#xff1a;快&#xff01;準&#xff01;狠&#xff01;策略一&#xff1a;利用索引優化帶 WHERE 子句的 COUNT(*) (最常見且…

如何在postman使用時間戳

1. 使用 Pre-request Script 動態轉換? 在發送請求前&#xff0c;將日期字符串轉為時間戳并存儲為環境變量/全局變量。 ?示例代碼? // 將日期字符串&#xff08;如 "2023-10-01"&#xff09;轉為時間戳&#xff08;毫秒&#xff09; const dateString "2…

嵌入式學習筆記 - 運算放大器的共模抑制比

一 定義 共模抑制比&#xff08;Common Mode Rejection Ratio, ?CMRR?&#xff09;是衡量差分放大器&#xff08;或差分電路&#xff09;抑制共模信號能力的關鍵指標。它在電子工程中尤為重要&#xff0c;特別是在需要處理微弱信號或對抗環境噪聲的場景中。 核心概念 ?共…

成龍電影中的三菱汽車

帕杰羅、 Lancer Evolution、 3000GT Mitsubishi Lancer Evo ll 1995 附錄 Mercedes-Benz 280SL&#xff08;W113&#xff09;&#xff0c;俗稱“Pagoda”&#xff08;帕格達&#xff09;

Spring 項目無法連接 MySQL:Nacos 配置誤區排查與解決

在開發過程中&#xff0c;我們使用 Nacos 來管理 Spring Boot 項目的配置&#xff0c;其中包括數據庫連接配置。然而&#xff0c;在實際操作中&#xff0c;由于一些概念的混淆&#xff0c;我們遇到了一些連接問題。本文將分享我的故障排查過程&#xff0c;幫助大家避免類似的錯…

LabVIEW與 IMAQ Vision 機器視覺應用

在工業生產及諸多領域&#xff0c;精確高效的檢測至關重要。基于 LabVIEW 與 IMAQ Vision 的機器視覺應用&#xff0c;深入剖析其原理、系統構成、軟件設計及優勢&#xff0c;為相關領域工程師提供全面技術參考。 ? 一、技術原理 &#xff08;一&#xff09;機器視覺技術基礎…

【STM32 學習筆記】USART串口

注意&#xff1a;在串口助手的接收模式中有文本模式和HEX模式兩種模式&#xff0c;那么它們有什么區別&#xff1f; ??文本模式和Hex模式是兩種不同的文件編輯或瀏覽模式&#xff0c;不是完全相同的概念。文本模式通常是指以ASCII編碼格式表示文本文件的編輯或瀏覽模式。在文…

【WPS】怎么解決“word的復制表格”粘貼到“excel的單元格”變多行單元格的問題

把 word文檔復制表格到這個excel表格上面的話&#xff0c;會出現由單個單元格變成多行單元格的情況。 現在&#xff0c;就這個問題怎么解決&#xff0c;提出了一個方案&#xff0c;就是先查找是什么導致了這個換行&#xff0c;然后再將換行的這個字符進行一個整體的替換&#x…

嵌入式開發面試題詳解:STM32 與嵌入式開發核心知識全面解析

一、STM32 共有幾種基本時鐘信號&#xff1f; 題目 STM32 共有幾種基本時鐘信號&#xff1f; 解答 STM32 包含 4 種基本時鐘信號&#xff0c;分別為 HSI&#xff08;內部高速時鐘&#xff09;、HSE&#xff08;外部高速時鐘&#xff09;、LSI&#xff08;內部低速時鐘&…

華為策略路由

路由策略&#xff1a;是對路由條目進行控制&#xff0c;通告控制路由條目影響報文的轉發路徑。路由策略為控制平面。 策略路由&#xff1a;是根據報文特征&#xff0c;認為的控制報文從某個即可轉發出去&#xff0c;不修改路由表。即策略路由為在轉發平面。 路由策略 策略路由…

# YOLOv3:深度學習中的目標檢測利器

YOLOv3&#xff1a;深度學習中的目標檢測利器 引言 在計算機視覺領域&#xff0c;目標檢測是一項核心任務&#xff0c;它涉及到識別圖像或視頻中的物體&#xff0c;并確定它們的位置。隨著深度學習技術的快速發展&#xff0c;目標檢測算法也在不斷進步。YOLO&#xff08;You …

紅黑樹刪除的實現與四種情況的證明

&#x1f9ed; 學習重點 刪除節點的三種情況紅黑樹如何恢復性質四種修復情況完整可運行的 C 實現 一、紅黑樹刪除的基礎理解 紅黑樹刪除比插入復雜得多&#xff0c;因為&#xff1a; 刪除的是黑節點可能會破壞“從根到葉子黑節點數相等”的性質。刪除紅節點無需修復&#xf…

vue配置代理解決前端跨域的問題

文章目錄 一、概述二、報錯現象三、通過配置代理來解決修改request.js中的baseURL為/api在vite.config.js中增加代理配置 四、參考資料 一、概述 跨域是指由于瀏覽器的同源策略限制&#xff0c;向不同源(不同協議、不同域名、不同端口)發送ajax請求會失敗 二、報錯現象 三、…