【數據結構】平衡二叉樹左旋右旋與紅黑樹

平衡二叉樹左旋右旋與紅黑樹

平衡二叉樹

定義

平衡二叉樹是二叉搜索樹的一種特殊形式。二叉搜索樹(Binary Search Tree,BST)是一種具有以下性質的二叉樹:

  1. 對于樹中的每個節點,其左子樹中的所有節點都小于該節點的值。
  2. 對于樹中的每個節點,其右子樹中的所有節點都大于該節點的值。
  3. 左子樹和右子樹都必須是二叉搜索樹。

而平衡二叉樹(Balanced Binary Tree)在滿足了二叉搜索樹的所有性質的基礎上,還額外保證了樹的高度盡可能小,即任意節點的左右子樹高度差不超過1。

舉例

以下是平衡二叉樹的幾個例子:

image-20240605200759976
image-20240605200952591
image-20240605201209176

旋轉機制

平衡二叉樹通過旋轉操作來保持其平衡性。旋轉操作主要有兩種類型:左旋轉和右旋轉。這些旋轉操作通常應用于AVL樹和紅黑樹等平衡二叉樹的調整過程中。

左旋轉:左旋轉是一種操作,將一個節點的右子節點提升為新的根節點,原來的根節點成為新根節點的左子節點。左旋轉的目的是減小樹的整體高度,以維持平衡。

右旋轉:右旋轉是一種操作,將一個節點的左子節點提升為新的根節點,原來的根節點成為新根節點的右子節點。右旋轉的目的也是減小樹的整體高度,以維持平衡。

觸發時機:當添加一個節點之后,該樹不再是一顆平衡二叉樹

左旋

當我們想給

image-20240605203655251

這個二叉樹中插入一個新的節點12,這個平衡二叉樹就會變為:

image-20240605204026181

此時我們就會發現二叉樹不平衡了,為了重新平衡,我們就需要進行旋轉了。

為了進行旋轉,我們需要去尋找支點:從添加的節點開始,不斷的往父節點找不平衡的節點

這里我們從節點12開始往上找:

  1. 節點11:平衡
  2. 節點10:不平衡

所以節點10為支點!!

左旋的步驟

  1. 以不平衡的點作為支點
  2. 把支點左旋降級,變成左子節點
  3. 晉升原來的右子節點

旋轉后的二叉樹為:

image-20240605204957416

? 以上為較為簡單的左旋,下面為較為復雜的左旋


已知二叉樹(不平衡):

image-20240605210025576

還是需要從添加的節點向上找不平衡的節點

  1. 節點11:平衡
  2. 節點10:平衡
  3. 節點7:不平衡

節點7為支點

而此時旋轉的步驟和剛才的就有所不同了:

  1. 以不平衡的點作為支點
  2. 將根節點的右側往左拉
  3. 原先的右子節點變成新的父節點,并把多余的左子節點出讓,給已經降級的根節點當右子節點

在上面的二叉樹中,多余的節點為節點9(節點9為節點10的左子結點很重要)。

下面為具體步驟:

  1. 先將節點9(多余的左子節點)分離:

    image-20240605211628021
  2. 以節點7為支點進行左旋:

    image-20240605211827936
  3. 將多余的節點進行分配

    因為節點9之前為節點10的左子結點,所以此時9節點應該繼續接才節點10的左邊,此處應該放在節點7的右節點上

image-20240605212502109
右旋

右旋與左旋在處理上是類似的,就不再粘貼圖示了

步驟

  1. 以不平衡的點作為支點
  2. 就是將根節點的左側往右拉
  3. 原先的左子節點變成新的父節點,并把多余的右子節點出讓,給已經降級的根節點當左子節點
需要旋轉的四種情況
1.左左(一次右旋)

當根節點左子樹的左子樹有節點插入,導致二叉樹不平衡

image-20240605213057309

有兩種添加情況:

image-20240605213149405

以節點7為根節點

我們只需要進行一次右旋就可以了:

image-20240605213447827
2.左右(兩次旋轉)

當根節點左子樹的右子樹有節點插入,導致二叉樹不平衡

image-20240605213605753

添加節點:

image-20240605213642896

此時僅僅一次右旋就不能實現平衡了。

我們需要先一4為支點,先局部左旋,再整體右旋就可以實現了:

image-20240605213913798 image-20240605213936624
3.右右(一次旋轉)

當根節點右子樹的右子樹有節點插入,導致二叉樹不平衡

image-20240605214019749

添加節點12:

image-20240605214049887

以節點7為支點進行左旋一次就能實現平衡:

image-20240605214153270
4.右左(兩次旋轉)

當根節點右子樹的左子樹有節點插入,導致二叉樹不平衡

image-20240605214225663

添加節點8:

image-20240605214256532

先局部右旋再整體左旋:

image-20240605214345028 image-20240605214403566

紅黑樹

  • 紅黑樹是一種自平衡的二叉查找樹,是計算機科學中用到的一種數據結構。
  • 1972年出現,當時被稱之為平衡二叉B樹。后來,1978年被修改為如今的"紅黑樹"
  • 它是一種特殊的二叉查找樹,紅黑樹的每一個節點上都有存儲位表示節點的顏色
  • 每一個節點可以是紅或者黑;紅黑樹不是高度平衡的,它的平衡是通過"紅黑規則"進行實現的
image-20240605214802488

紅黑規則

  1. 每一個節點或是紅色的,或者是黑色的
  2. 根節點必須是黑色
  3. 如果一個節點沒有子節點或者父節點,則該節點相應的指針屬性值為Nǐl,這些Nil視為葉節點,每個葉節點(Nil)是黑色的
  4. 如果某一個節點是紅色,那么它的子節點必須是黑色(不能出現兩個紅色節點相連的情況)
  5. 對每一個節點,從該節點到其所有后代葉節點的簡單路徑上,均包含相同數目的黑色節點

添加節點規則

默認顏色:添加節點默認是紅色的(效率高)

舉例

假設我們需要添加三個節點:201823

1.假設三個節點都是黑色的

image-20240607223039144

先添加節點20:

image-20240607223112967

然后添加節點18:

image-20240607223319365

此時我們發現我們的紅黑樹已經違背了紅黑規則(第五條規則)

如果我們把節點18變為紅色,則就滿足了紅黑規則:

image-20240607223414483

下來存節點23:

image-20240607223438885

依舊違背紅黑規則,將23變為紅色:

image-20240607223519105

一共調整了兩次節點顏色

2.假設節點顏色都為紅色:

那么先添加節點20:

image-20240607223640658

違背了規則2

將節點變為黑色后,插入節點18:

image-20240607223723203

并沒有違背紅黑規則,不需要調整

下來添加節點23:

image-20240607223812606

依然不需要調整。

一共調整了一次節點顏色

所以我們得出結論:默認顏色:添加節點默認是紅色的(效率高)

小結

本篇博客到這里就結束了,如果有錯誤麻煩大家指正,感謝閱讀!

已經到底啦!!!

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

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

相關文章

【vector模擬實現】附加代碼講解

vector模擬實現 一、看源代碼簡單實現1. push_backcapacity(容量)sizereserve(擴容)operator[ ] (元素訪問) 2. pop_back3. itorator(迭代器)4.insert & erase (頭插…

哈夫曼樹的創建

要了解哈夫曼樹,可以先了解一下哈夫曼編碼,假設我們有幾個字母,他們的出現頻率是A: 1 B: 2 C: 3 D: 4 E: 5 F: 6 G: 7。那么如果想要壓縮數據的同時讓訪問更加快捷,就要讓頻率高的字母離根節點比較進,容易訪問&#xf…

立創·天空星開發板-GD32F407VE-GPIO

本文以 立創天空星開發板-GD32F407VET6-青春版 作為學習的板子,記錄學習筆記。 立創天空星開發板-GD32F407VE-GPIO 基礎概念三極管MOS管 GPIO輸出模式輸出線與GPIO輸入模式GPIO點燈 基礎概念 GPIO,全稱為“通用輸入/輸出”(General Purpose …

算法金 | 這次終于能把張量(Tensor)搞清楚了!

大俠幸會,在下全網同名[算法金] 0 基礎轉 AI 上岸,多個算法賽 Top [日更萬日,讓更多人享受智能樂趣] 1. 張量(Tensor)基礎概念 1.1 張量的定義與重要性 張量是深度學習中用于表示數據的核心結構,它可以視…

《帝國時代 III:決定版》秘籍 怎么在蘋果電腦上玩《帝國時代 III:決定版》

《帝國時代 III:決定版》是一款讓玩家沉浸于歷史長河體驗從大航海時代到工業革命時期的游戲。下面我們來看看《帝國時代 III:決定版》是什么類型的游戲,《帝國時代 III:決定版》Mac安裝教程的相關內容。 一、《帝國時代 III&…

【BOM02】本地存儲

一:什么是本地存儲 數據存儲在用戶瀏覽器中,用戶設置、讀取方便,同時頁面刷新時不會丟失數據。存儲在瀏覽器中數據約5M,分為sessionStorage和localStorage兩種存儲方式 二:localStorage存儲 作用 將數據永久存儲在…

opencv實戰小結-銀行卡號識別

實戰1-銀行卡號識別 項目來源:opencv入門 項目目的:識別傳入的銀行卡照片中的卡號 難點:銀行卡上會有一些干擾項,如何排除這些干擾項,并且打印正確的號碼是一個問題 最終效果如上圖 實現這樣的功能需要以下幾個步驟…

基于Amazon Linux使用pip安裝certbot并使用Apache配置證書的完整步驟

配置證書 1. 更新系統和安裝必要的軟件包 首先,確保系統和包管理器是最新的: sudo dnf update -y sudo dnf install -y python3 python3-pip python3-virtualenv httpd mod_ssl2. 創建并激活虛擬環境 為了避免依賴沖突,使用virtualenv創建…

算法導論實戰(三)(算法導論習題第二十四章)

🌈 個人主頁:十二月的貓-CSDN博客 🔥 系列專欄: 🏀算法啟示錄 💪🏻 十二月的寒冬阻擋不了春天的腳步,十二點的黑夜遮蔽不住黎明的曙光 目錄 前言 第二十四章 24.1-3 24.1-4 2…

筆記:DST與HPPC測試方法

一、DST測試方法: DST全稱為Dynamic Stress Test,是一種動態壓力測試方法,主要用于評估電池在實際使用條件下的綜合性能,模擬了車輛在行駛過程中可能會遇到的各種動態負載變化,如加速、減速、怠速等工況。 它的目的是評估電池在…

setattr前端接收方法深度解析

setattr前端接收方法深度解析 在前端開發中,setattr可能是一個較為陌生的概念,但它卻在某些場景下扮演著關鍵角色。setattr是一個Python內置函數,用于設置對象屬性的值。然而,在前端與后端交互的過程中,我們有時需要處…

【Week-R2】使用LSTM實現火災預測(tf版本)

【Week-R2】使用LSTM實現火災預測(tf版本) 一、 前期準備1.1 設置GPU1.2 導入數據1.3 數據可視化 二、數據預處理(構建數據集)2.1 設置x、y2.2 歸一化2.3 劃分數據集 三、模型創建、編譯、訓練、得到訓練結果3.1 構建模型3.2 編譯模型3.3 訓練模型3.4 模…

超詳細的java Comparable,Comparator接口解析

前言 Hello大家好呀,在java中我們常常涉及到對象的比較,不同于基本數據類型,對于我們的自定義對象,需要我們自己去建立比較標準,例如我們自定義一個People類,這個類有name和age兩個屬性,那么問…

[數據集][圖像分類]蘑菇分類數據集3122張215類別

數據集類型:圖像分類用,不可用于目標檢測無標注文件 數據集格式:僅僅包含jpg圖片,每個類別文件夾下面存放著對應圖片 圖片數量(jpg文件個數):3122 分類類別數:215 類別名稱:[“almond_mushroom”,“amanita…

實驗筆記之——DPVO(Deep Patch Visual Odometry)

本博文記錄本文測試DPVO的過程,本博文僅供本人學習記錄用~ 《Deep Patch Visual Odometry》 代碼鏈接:GitHub - princeton-vl/DPVO: Deep Patch Visual Odometry 目錄 配置過程 測試記錄 參考資料 配置過程 首先下載代碼以及創建conda環境 git clo…

Data Management Controls

Data Browsing and Analysis Data Grid 以標準表格或其他視圖格式(例如,帶狀網格、卡片、瓷磚)顯示數據。Vertical Grid 以表格形式顯示數據,數據字段顯示為行,記錄顯示為列。Pivot Grid 模擬微軟Excel的樞軸表功…

有待挖掘的金礦:大模型的幻覺之境

人工智能正在迅速變得無處不在,在科學和學術研究中,自回歸的大型語言模型(LLM)走在了前列。自從LLM的概念被整合到自然語言處理(NLP)的討論中以來,LLM中的幻覺現象一直被廣泛視為一個顯著的社會…

Oracle EBS AP發票創建會計科目提示:APP-SQLAP-10710:無法聯機創建會計分錄

系統版本 RDBMS : 12.1.0.2.0 Oracle Applications : 12.2.6 問題癥狀: 提交“創建會計科目”請求提示錯誤信息如下: APP-SQLAP-10710:無法聯機創建會計分錄。 請提交應付款管理系統會計流程,而不要為此事務處理創建會計分錄解決方法 數據修復SQL腳本: UPDATE ap_invoi…

LabVIEW閥性能試驗臺測控系統

本項目開發的閥性能試驗臺測控系統是為滿足國家和企業相關標準而設計的,主要用于汽車氣壓制動系統控制裝置和調節裝置等產品的綜合性能測試。系統采用工控機控制,配置電器控制柜,實現運動控制、開關量控制及傳感器信號采集,具備數…

vue封裝一個查詢URL參數方法

vue封裝一個查詢URL參數方法 在 Vue 中,你可以封裝一個查詢 URL 參數的方法來獲取 URL 中的查詢參數。以下是一個示例代碼: export const getQueryParam (param) > {const urlParams new URLSearchParams(window.location.search);return urlPara…