紅黑樹分析

紅黑樹的性質:

性質1:每個節點要么是黑色,要么是紅色。

  • 性質2:根節點是黑色。
  • 性質3:每個葉子節點(NIL)是黑色。
  • 性質4:每個紅色節點的兩個子節點一定都是黑色。不能有兩個紅色節點相連。
  • 性質5:任意一節點到每個葉子節點的路徑都包含數量相同的黑結點。俗稱:黑高!
  • 從性質5又可以推出:性質5.1:如果一個節點存在黑子節點,那么該結點肯定有兩個子節點

總結:
根節點必黑,新增是紅色,只能黑連黑,不能紅連紅

紅黑樹的操作:

紅黑樹能自平衡,它靠的三種操作:左旋、右旋和變色。
1.變色:結點的顏色由紅變黑或由黑變紅。
2.左旋:以某個結點作為支點(旋轉結點),其右子結點變為旋轉結點的父結點,右子結點的左子結點變為旋轉結點的右子結點,左子結點保持不變。

在這里插入圖片描述

3.右旋:以某個結點作為支點(旋轉結點),其左子結點變為旋轉結點的父結點,左子結點的右子結點變為旋轉結點的左子結點,右子結點保持不變
在這里插入圖片描述

紅黑樹插入節點情景分析

在這里插入圖片描述

情景1:紅黑樹為空樹
最簡單的一種情景,直接把插入結點作為根結點就行
注意:根據紅黑樹性質2:根節點是黑色。還需要把插入結點設為黑色。

情景2:插入結點的Key已存在
處理:更新當前節點的值,為插入節點的值

情景3:插入結點的父結點為黑結點
由于插入的結點是紅色的,當插入結點的黑色時,并不會影響紅黑樹的平衡,直接插入即可,無需做自平衡。

情景4:插入節點的父節點為紅色
再次回想下紅黑樹的性質2:根結點是黑色。如果插入節點的父結點為紅結點,那么該父結點不可能為根結點,所以插入結點總是存在祖父結點。
這一點很關鍵,因為后續的旋轉操作肯定需要祖父結點的參與

插入情景4.1:叔叔結點存在并且為紅結點
依據紅黑樹性質4可知,紅色節點不能相連 ==> 祖父結點肯定為黑結點;
因為不可以同時存在兩個相連的紅結點。那么此時該插入子樹的紅黑層數的情況是:黑紅紅。顯然最簡單的處理方式是把其改為:紅黑紅
處理:
1.將P和U節點改為黑色
2.將PP改為紅色
3.將PP設置為當前節點,進行后續處理

插入情景4.2:叔叔結點不存在或為黑結點,并且插入結點的父親結點是祖父結點的左子結點
注意:單純從插入前來看,叔叔節點非紅即空(NIL節點),否則的話破壞了紅黑樹性質5,此路徑會比其它路徑多一個黑色節點。

插入情景4.2.1:新插入節點,為其父節點的左子節點(LL紅色情況)
處理:
1.變顏色:將P設置為黑色,將PP設置為紅色
2.對PP節點進行右旋

插入情景4.2.2:新插入節點,為其父節點的右子節點(LR紅色情況)
處理:
1.對P進行左旋
2.將P設置為當前節點,得到LL紅色情況
3.按照LL紅色情況處理(1.變顏色 2.右旋PP)

插入情景4.3:叔叔結點不存在或為黑結點,并且插入結點的父親結點是祖父結點的右子結點
處理:
1.變顏色:將P設置為黑色,將PP設置為紅色
2.對PP節點進行左旋

插入情景4.3.2:新插入節點,為其父節點的左子節點(RL紅色情況)
處理:
1.對P進行右旋
2.將P設置為當前節點,得到RR紅色情況
3.按照RR紅色情況處理(1.變顏色 2.左旋PP)

總結

爸叔通紅就變色,爸紅叔黑就旋轉,哪邊黑往哪邊轉。

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

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

相關文章

overlay 如何實現跨主機通信?- 每天5分鐘玩轉 Docker 容器技術(52)

上一節我們在 host1 中運行了容器 bbox1,今天將詳細討論 overlay 網絡跨主機通信的原理。 在 host2 中運行容器 bbox2: bbox2 IP 為 10.0.0.3,可以直接 ping bbox1: 可見 overlay 網絡中的容器可以直接通信,同時 docke…

第 132 章 Example

這里介紹一個負載均衡放置問題,我們可以把它擺放在任何位置,每種方案都各有優缺點,需要根據你的實際情況選擇使用 適用于HAProxy / Nginx / LVS 等等 這里用web,db為例子,講述負載均衡之間的關系 132.1. 雙負載均衡的用法 User --…

Python:實現圖片裁剪的兩種方式——Pillow和OpenCV

原文:https://blog.csdn.net/hfutdog/article/details/82351549 在這篇文章里我們聊一下Python實現圖片裁剪的兩種方式,一種利用了Pillow,還有一種利用了OpenCV。兩種方式都需要簡單的幾行代碼,這可能也就是現在Python那么流行的原…

第一個應在JavaScript數組的最后

by Thomas Barrasso由Thomas Barrasso 第一個應在JavaScript數組的最后 (The first shall be last with JavaScript arrays) So the last shall be [0], and the first [length — 1].所以最后一個應該是[0] ,第一個[length_1]。 – Adapted from Matthew 20:16–根…

鼠標移動到ul圖片會擺動_我們可以從擺動時序分析中學到的三件事

鼠標移動到ul圖片會擺動An opportunity for a new kind of analysis of Major League Baseball data may be upon us soon. Here’s how we can prepare.不久之后,我們將有機會對美國職棒大聯盟數據進行新的分析。 這是我們準備的方法。 It is tempting to think t…

leetcode 1052. 愛生氣的書店老板(滑動窗口)

今天,書店老板有一家店打算試營業 customers.length 分鐘。每分鐘都有一些顧客(customers[i])會進入書店,所有這些顧客都會在那一分鐘結束后離開。 在某些時候,書店老板會生氣。 如果書店老板在第 i 分鐘生氣&#xf…

回到網易后開源APM技術選型與實戰

篇幅一:APM基礎篇\\1、什么是APM?\\APM,全稱:Application Performance Management ,目前市面的系統基本都是參考Google的Dapper(大規模分布式系統的跟蹤系統)來做的,翻譯傳送門《google的Dappe…

持續集成持續部署持續交付_如何開始進行持續集成

持續集成持續部署持續交付Everything you need to know to get started with continuous integration: branching strategies, tests automation, tools and best practices.開始進行持續集成所需的一切:分支策略,測試自動化,工具和最佳實踐。…

51nod 1073約瑟夫環

思路傳送門 &#xff1a;http://blog.csdn.net/kk303/article/details/9629329 n里面挑選m個 可以遞推從n-1里面挑m個 然后n-1里面的x 可以轉換成 n里面的x 的公式 x &#xff08;xm&#xff09;%n; #include <bits/stdc.h> using namespace std;int main () {int n,m;s…

如何選擇優化算法遺傳算法_用遺傳算法優化垃圾收集策略

如何選擇優化算法遺傳算法Genetic Algorithms are a family of optimisation techniques that loosely resemble evolutionary processes in nature. It may be a crude analogy, but if you squint your eyes, Darwin’s Natural Selection does roughly resemble an optimisa…

robot:截圖關鍵字

參考&#xff1a; https://www.cnblogs.com/hong-fithing/p/9656221.html--python https://blog.csdn.net/weixin_43156282/article/details/87350309--robot https://blog.csdn.net/xiongzaiabc/article/details/82912280--截圖指定區域 轉載于:https://www.cnblogs.com/gcgc/…

leetcode 832. 翻轉圖像

給定一個二進制矩陣 A&#xff0c;我們想先水平翻轉圖像&#xff0c;然后反轉圖像并返回結果。 水平翻轉圖片就是將圖片的每一行都進行翻轉&#xff0c;即逆序。例如&#xff0c;水平翻轉 [1, 1, 0] 的結果是 [0, 1, 1]。 反轉圖片的意思是圖片中的 0 全部被 1 替換&#xff…

SVN服務備份操作步驟

SVN服務備份操作步驟1、準備源服務器和目標服務器源服務器&#xff1a;192.168.1.250目標服務器&#xff1a;192.168.1.251 root/rootroot 2、對目標服務器&#xff08;251&#xff09;裝SVN服務器&#xff0c; 腳本如下&#xff1a;yum install subversion 3、創建一個新的倉庫…

SpringCloud入門(一)

1. 系統架構演變概述 #mermaid-svg-F8dvnEDl6rEgSP97 .label{font-family:trebuchet ms, verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-F8dvnEDl6rEgSP97 .label text{fill:#333}#mermaid-svg-F8dvnEDl6rEgSP97 .node rect,#merm…

PullToRefreshListView中嵌套ViewPager滑動沖突的解決

PullToRefreshListView中嵌套ViewPager滑動沖突的解決 最近恰好遇到PullToRefreshListView中需要嵌套ViewPager的情況,ViewPager 作為頭部添加到ListView中&#xff0c;發先ViewPager在滑動過程中流暢性太差幾乎很難左右滑動。在網上也看了很多大神的介紹&#xff0c;看了ViewP…

神經網絡 卷積神經網絡_如何愚弄神經網絡?

神經網絡 卷積神經網絡Imagine you’re in the year 2050 and you’re on your way to work in a self-driving car (probably). Suddenly, you realize your car is cruising at 100KMPH on a busy road after passing through a cross lane and you don’t know why.想象一下…

數據特征分析-分布分析

分布分析用于研究數據的分布特征&#xff0c;常用分析方法&#xff1a; 1、極差 2、頻率分布 3、分組組距及組數 df pd.DataFrame({編碼:[001,002,003,004,005,006,007,008,009,010,011,012,013,014,015],\小區:[A村,B村,C村,D村,E村,A村,B村,C村,D村,E村,A村,B村,C村,D村,E村…

開發工具總結(2)之全面總結Android Studio2.X的填坑指南

前言&#xff1a;好多 Android 開發者都在說Android Studio太坑了&#xff0c;老是出錯&#xff0c;導致開發進度變慢&#xff0c;出錯了又不知道怎么辦&#xff0c;網上去查各種解決方案五花八門&#xff0c;有些可以解決問題&#xff0c;有些就是轉來轉去的寫的很粗糙&#x…

無聊的一天_一人互聯網公司背后的無聊技術

無聊的一天Listen Notes is a podcast search engine and database. The technology behind Listen Notes is actually very very boring. No AI, no deep learning, no blockchain. “Any man who must say I am using AI is not using True AI” :)Listen Notes是一個播客搜索…

如何在Pandas中使用Excel文件

From what I have seen so far, CSV seems to be the most popular format to store data among data scientists. And that’s understandable, it gets the job done and it’s a quite simple format; in Python, even without any library, one can build a simple CSV par…