主頁 >  其他 > 為實習準備的資料化結構(8)-- 傾心圖解紅黑樹

為實習準備的資料化結構(8)-- 傾心圖解紅黑樹

2021-02-13 11:20:44 其他

在這里插入圖片描述

文章目錄

    • 紅黑樹
      • 紅黑樹的特征
      • 紅黑樹自平衡的奧秘
    • 紅黑樹自平衡操作
      • 插入節點
      • 洗掉節點

紅黑樹

紅黑樹(Red Black Tree) 是一種自平衡二叉查找樹,是在計算機科學中用到的一種資料結構,
紅黑樹是一種平衡二叉查找樹的變體,它的左右子樹高差有可能大于 1,所以紅黑樹不是嚴格意義上的平衡二叉樹(AVL),但 對之進行平衡的代價較低, 其平均統計性能要強于 AVL ,
由于每一棵紅黑樹都是一顆二叉排序樹,因此,在對紅黑樹進行查找時,可以采用運用于普通二叉排序樹上的查找演算法,在查找程序中不需要顏色資訊,

紅黑樹的特征

紅黑樹是每個結點都帶有顏色屬性的二叉查找樹,顏色或紅色或黑色,在二叉查找樹強制一般要求以外,對于任何有效的紅黑樹我們增加了如下的額外要求:

性質1. 結點是紅色或黑色,
性質2. 根結點是黑色,
性質3. 所有葉子都是黑色,(葉子是NULL結點)(這個性質我也不知道有什么用,最好配上上面的圖看,不然會暈)
性質4. 每個紅色結點的兩個子結點都是黑色,(從每個葉子到根的所有路徑上不能有兩個連續的紅色結點)
性質5. 從任一節結點到每個葉子的所有路徑都包含相同數目的黑色結點

這些約束強制了紅黑樹的關鍵性質: 從根到葉子的最長的可能路徑不多于最短的可能路徑的兩倍長,這個在高度上的理論上限允許紅黑樹在最壞情況下都是高效的,
是性質4導致路徑上不能有兩個連續的紅色結點確保了這個結果,最短的可能路徑都是黑色結點,最長的可能路徑有交替的紅色和黑色結點,因為根據性質5所有最長的路徑都有相同數目的黑色結點,這就表明了沒有路徑能多于任何其他路徑的兩倍長,


紅黑樹自平衡的奧秘

紅黑樹能夠實作自平衡,靠的是三個法寶:左旋、右旋和變色,
對于旋轉我就不再多說了,前面的AVL樹要是不夠看可以再看看伸展樹,

左旋:以某個結點作為支點(旋轉結點),其右子結點變為旋轉結點的父結點,右子結點的左子結點變為旋轉結點的右子結點,左子結點保持不變,
右旋:以某個結點作為支點(旋轉結點),其左子結點變為旋轉結點的父結點,左子結點的右子結點變為旋轉結點的左子結點,右子結點保持不變,
變色:結點的顏色由紅變黑或由黑變紅,

紅黑樹的查找也不說了,它是二叉樹,所以二叉樹怎么查找,紅黑樹就怎么查找,


紅黑樹自平衡操作

插入節點

第一步: 將紅黑樹當作一顆二叉查找樹,將節點插入,
第二步:將插入的節點著色為"紅色",為什么是紅色?你猜啊
(看一下性質五)
第三步: 通過一系列的旋轉或著色等操作,使之重新成為一顆紅黑樹,

第二步中,將插入節點著色為"紅色"之后,不會違背"特性(5)",那它到底會違背哪些特性呢?
很顯然,只有性質4.(每個紅色結點的兩個子結點都是黑色,(從每個葉子到根的所有路徑上不能有兩個連續的紅色結點))比較危險,
那接下來,想辦法使之"滿足性質4. ",就可以將樹重新構造成紅黑樹了,


昨天我躺在床上,輾轉反側,夢中頓悟,紅黑樹插入會有以下這么幾種情況:

1、被插入的節點是根節點,
	那最好辦,那說明是空樹,直接涂黑就好,
2、新插入節點的父節點是黑的(新插入的節點,不會有子節點存在,這個可以放心)
	這個更好辦,就插入就完了
3、新插入節點的父節點是紅的
	那就有意思了,具體情況下面討論

對于上面第三種情況的再分析:

1、新節點的父節點的兄弟節點是紅的
//以下兩種情況默認包含了父節點沒有兄弟的情況
2、新節點的父節點的兄弟節點是黑的,且當前節點是其父節點的 右 孩子
3、新節點的父節點的兄弟節點是黑的,且當前節點是其父節點的 左 孩子
(為什么要這樣分?不急慢慢看,我也納悶兒呢!!!)

上面三種情況處理問題的核心思路都是:將紅色的節點移到根節點;然后,將根節點設為黑色,下面對它們詳細進行介紹,

情況一:

策略:

(01) 將“父節點”設為黑色,
(02) 將“叔叔節點”設為黑色,
(03) 將“祖父節點”設為“紅色”,
(04) 將“祖父節點”設為“當前節點”(紅色節點);即,之后繼續對“當前節點”進行操作,

這里需要說明一下,當祖父節點被染紅,它可能會和它自己的父節點起沖突,所以需要向上遞回,
就碧如這樣:
在這里插入圖片描述

為什么采用這個策略?

“當前節點”和“父節點”都是紅色,違背“性質4. ”,所以,將“父節點”設定“黑色”以解決這個問題,
但是,將“父節點”由“紅色”變成“黑色”之后,違背了“性質5. ”:因為,包含“父節點”的分支的黑色節點的總數增加了1,
解決這個問題的辦法是:將“祖父節點”由“黑色”變成紅色,同時,將“叔叔節點”由“紅色”變成“黑色”,
這里為什么要將“叔叔節點”也變黑?思考思考,不難理解的,
理解不了的話對著上面那張圖去數性質5.

這里需要再說明一下,當祖父節點被染紅,它可能會和它自己的父節點起沖突,所以需要向上遞回


情況二:

策略:

(01) 將“父節點”作為“新的當前節點”,
(02) 以“新的當前節點”為支點進行左旋,

草率了,,,
哎,看圖吧:
在這里插入圖片描述

吶,弄完之后,變成了第三種情況了,


情況三:

策略:

(01) 將“父節點”設為“黑色”,
(02) 將“祖父節點”設為“紅色”,
(03) 以“祖父節點”為支點進行右旋,

在這里插入圖片描述

為什么采用這個策略?

為了便于說明,我們設定“當前節點”為S(Original Son),“兄弟節點”為B(Brother),“叔叔節點”為U(Uncle),“父節點”為F(Father),祖父節點為G(Grand-Father),

S和F都是紅色,違背了紅黑樹的“性質4. ”,我們可以將F由“紅色”變為“黑色”,就解決了“違背‘性質4. ’”的問題;但卻引起了其它問題:違背“性質5. ”,因為將F由紅色改為黑色之后,所有經過F的分支的黑色節點的個數增加了1,那我們如何解決“所有經過F的分支的黑色節點的個數增加了1”的問題呢? 我們可以通過“將G由黑色變成紅色”,同時“以G為支點進行右旋”來解決,


對于紅黑樹的節點插入,我講明白了嗎?
關注點贊收藏,我們繼續往下,


洗掉節點

相較于插入操作,紅黑樹的洗掉操作則要更為復雜一些,洗掉操作首先要確定待洗掉節點有幾個孩子,如果有兩個孩子,不能直接洗掉該節點,而是要先找到該節點的前驅(該節點左子樹中最大的節點)或者后繼(該節點右子樹中最小的節點),然后將前驅或者后繼的值復制到要洗掉的節點中,最后再將前驅或后繼洗掉,

第一步:將紅黑樹當作一顆二叉查找樹,將節點洗掉,
第二步:通過"旋轉和重新著色"等一系列來修正該樹,使之重新成為一棵紅黑樹,

在第一步中"將紅黑樹當作一顆二叉查找樹,將節點洗掉"后,可能違反"性質(2)、(4)、(5)"三個性質,第二步需要解決上面的三個問題,進而保持紅黑樹的全部特性,

洗掉一個紅色節點,并不會有什么不適,
所以我們將目光聚焦在洗掉一個黑色節點上,

洗掉一個節點有以下四種情況:

1.洗掉的節點沒有孩子
2.洗掉的節點只有左子樹
3.洗掉的節點只有右子樹
*4.洗掉的節點擁有左子樹和右子樹

其實只有上面前三種情況,對于第四種情況,可以找到待洗掉節點的直接后繼節點,用這個節點的值替代待洗掉節點,接著情況轉變為洗掉這個直接后繼節點,情況也變為前三種之一,(前驅和后繼至多只有一個孩子節點)

1.洗掉的節點只有左子樹或只有右子樹:
在這里插入圖片描述

在這里插入圖片描述


2.洗掉的節點沒有孩子

1)待洗掉節點是紅色的,直接刪去這個節點,
2)父節點P是紅色節點
 解決方案:把P節點染成黑色,兄弟節點染成紅色,洗掉節點D,

在這里插入圖片描述


3)兄弟節點S是紅色節點

在這里插入圖片描述

在這里插入圖片描述

解決方案:把P染成紅色,S染成黑色,然后以P為軸做相應的旋轉操作(D為P的左子樹則左旋,否則右旋)

在這里插入圖片描述


4)節點D的遠親侄子為紅色節點的情況(父節點P可紅可黑)

在這里插入圖片描述

解決方案:交換P和S的顏色,然后把遠親侄子節點SR/SL設定為黑色,再已P為軸做相應的旋轉操作(D為P的左子樹則左旋,否則右旋),洗掉節點D,

在這里插入圖片描述


5)節點D的近親侄子為紅色節點的情況(父節點P可紅可黑)

在這里插入圖片描述

解決方案:把S染成紅色,把近親侄子節點SR/SL染成黑色,然后以節點S為軸做相應的旋轉操作(D為P的左子樹則右旋,否則左旋),變成了情況4,按照情況4進行操作,
在這里插入圖片描述


6)節點D,P,S均為黑色節點

在這里插入圖片描述

解決方案:把D刪去,然后把節點S染成紅色,

①從節點P往上依然是全黑的情況
在這里插入圖片描述

②從節點P往上是其他情況
在這里插入圖片描述


哇,累,


在這里插入圖片描述

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/259168.html

標籤:AI

上一篇:95%置信區間

下一篇:66-CAS 有什么缺點?

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more