【算法筆記】紅黑樹插入操作

紅黑樹插入與調整詳解

一、紅黑樹的五大性質

紅黑樹是一種自平衡的二叉搜索樹(BST),其核心特性如下:

  1. 顏色屬性:每個節點非紅即黑
  2. 根屬性:根節點必須為黑色
  3. 葉子屬性:所有的 NIL 葉子節點都是黑色
  4. 紅節點約束:紅色節點的子節點必須為黑色(即無連續紅節點
  5. 黑高平衡:從任一節點到其所有后代葉子節點的路徑中,黑色節點數量相等

二、插入操作流程

階段 1:標準 BST 插入

  • 從根節點開始查找插入位置
  • 新節點總是紅色
  • 按照 BST 規則插入

階段 2:平衡修復(重點)

當插入后新節點的父節點是紅色時,需要進行結構調整。核心考量因素:

  • 父節點是祖父的左孩子還是右孩子
  • 叔叔節點的顏色
  • 新節點的插入方向(左/右)

三、調整情況詳解

情況分類表

父節點位置叔叔顏色插入方向操作類型案例編號
左子樹-重新著色Case 1
左子樹右孩子左旋Case 2
左子樹左孩子右旋 + 變色Case 3
右子樹-重新著色Case 1’
右子樹左孩子右旋Case 2’
右子樹右孩子左旋 + 變色Case 3’

詳細調整步驟(以父節點為左孩子為例)

Case 1:叔叔為紅色
  • 父節點、叔叔設為黑色
  • 祖父節點設為紅色
  • 將祖父節點作為新節點,遞歸向上調整
Case 2:叔叔為黑且新節點是右孩子
  • 以父節點為支點進行左旋
  • 轉換為 Case 3 處理
Case 3:叔叔為黑且新節點是左孩子
  • 父節點設為黑色
  • 祖父節點設為紅色
  • 以祖父節點為支點進行右旋

父節點為右孩子的情況完全對稱。


四、記憶技巧與口訣

三步判斷法

  1. 看顏色:父節點為紅色才需要調整
  2. 查叔叔:查看叔叔節點顏色
  3. 辨方向:判斷新節點是左插還是右插

核心口訣

紅叔變色向上傳,
黑叔旋轉看方向;
先左后右調平衡,
黑高不變記心上。

顏色標記法

  • 紅色節點:可能引發沖突
  • 黑色節點:安全、穩定
  • 新插入節點:總是紅色

五、代碼實現框架

def insert_fixup(tree, z):while z.parent.color == RED:if z.parent == z.parent.parent.left:uncle = z.parent.parent.rightif uncle.color == RED:  # Case 1z.parent.color = BLACKuncle.color = BLACKz.parent.parent.color = REDz = z.parent.parentelse:if z == z.parent.right:  # Case 2z = z.parentleft_rotate(tree, z)# Case 3z.parent.color = BLACKz.parent.parent.color = REDright_rotate(tree, z.parent.parent)else:# 對稱處理:父節點為右孩子uncle = z.parent.parent.leftif uncle.color == RED:  # Case 1'z.parent.color = BLACKuncle.color = BLACKz.parent.parent.color = REDz = z.parent.parentelse:if z == z.parent.left:  # Case 2'z = z.parentright_rotate(tree, z)# Case 3'z.parent.color = BLACKz.parent.parent.color = REDleft_rotate(tree, z.parent.parent)tree.root.color = BLACK

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

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

相關文章

認知計算革命:從算法創新到產業落地的AI專業核心應用全景

??一、自動化機器學習(AutoML)?? ??技術機理與產業實踐深度剖析?? ??神經網絡架構搜索(NAS)?? 強化學習方案:Google Brain的NASNet采用策略梯度優化卷積單元進化算法方案:DeepMind的AmeobaNe…

篇章十 論壇系統——業務開發——板塊和帖子

目錄 1.板塊 1.1 思路 1.2 實現邏輯 1.3 參數要求 1.4 實現步驟 1.Mapper.xml 2.Mapper.java 3.Service接口 4.Service實現 5.單元測試 6.Controller 7.測試API 8.前后端交互 2.帖子 1.1思路?編輯 1.2 參數要求 ?編輯 1.3 實現步驟 1.Mapper.xml 2.Mapper…

React Native 上線前的準備與企業實戰經驗總結

上線前的準備與企業實戰經驗總結 關鍵要點 熱更新簡化部署:CodePush 和 Expo OTA 允許快速推送 JavaScript 和資源更新,繞過應用商店審核,適合修復 Bug 或小規模功能迭代。監控與分析提升質量:Sentry 提供實時錯誤跟蹤&#xff…

【AI時代速通QT】第一節:C++ Qt 簡介與環境安裝

目錄 前言 一、為什么是 Qt?—— C 開發者的必備技能 二、Qt 的核心魅力:不止于跨平臺 2.1 優雅之一:代碼隔離,清晰明了 2.2 優雅之二:信號與槽(Signal & Slot)機制 2.3 優雅之三&…

pandas學習筆記

前言 總結才是知識,作者習慣不好,不會總結,導致函數一旦不使用就會忘記怎么使用,特此寫了本文,用于給自己一個復習的資料. 提示:如果你是小白,每個代碼請自己敲打。 一 pandas的介紹 Pandas is…

算法題(力扣每日一題)—改變一個整數能得到的最大差值

給你一個整數 num 。你可以對它進行以下步驟共計 兩次&#xff1a; 選擇一個數字 x (0 < x < 9). 選擇另一個數字 y (0 < y < 9) 。 數字 y 可以等于 x 。 將 num中所有出現 x 的數位都用 y 替換。 令兩次對 num 的操作得到的結果分別為 a 和 b 。 請你返回 a 和 b…

Kubernetes筆記

1.簡介 Kubernetes的本質是一組服務器集群&#xff0c;它可以在集群的每個節點上運行特定的程序&#xff0c;來對節點中的容器進行管理。目的是實現資源管理的自動化&#xff0c;主要提供了如下的主要功能&#xff1a; 自我修復&#xff1a;一旦某一個容器崩潰&#xff0c;能夠…

Flutter——數據庫Drift開發詳細教程(八)

目錄 自定義 SQL 類型定義類型使用自定義類型在 Dart 中在 SQL 中 方言意識支持的 SQLite 擴展json1fts5地緣壟斷 自定義 SQL 類型 Drift 的核心庫主要以 SQLite3 為目標平臺編寫。這體現在Drift 開箱即用的SQL 類型上——這些類型由 SQLite3 支持&#xff0c;并新增了一些由 …

安卓遠控工具 CRaxsRat v7.6 安裝與使用教程(僅供合法測試學習)

在當今的信息安全領域&#xff0c;移動設備已成為重點關注對象。本文將介紹一款用于遠程管理與教學研究的工具 —— CRaxsRat v7.6&#xff0c;并詳細講解其安裝與使用流程。本教程僅供網絡安全愛好者在合法授權環境下學習使用&#xff0c;嚴禁任何非法用途。 &#x1f50d; 一…

容器的本質是進程

前言 Linux 容器的本質&#xff0c;是一個被隔離和限制的進程。 與虛擬機不同&#xff0c;容器無需虛擬化一個完整的操作系統&#xff0c;所以它比虛擬機更輕量級&#xff0c;效率也更高。 Linux 容器通過 namespaces 技術來隔離容器的視圖&#xff0c;使得容器進程只能看到…

LeetCode 第75題:顏色分類

給定一個包含紅色、白色和藍色、共n個元素的數組nums&#xff0c;原地對它們進行排序&#xff0c;使得相同顏色的元素相鄰&#xff0c;并按照紅色、白色、藍色順序排序。 使用整數0、1和2分布表示紅色、白色和藍色。 必須在不使用庫內置sort函數的情況下解決這個問題。 示例1&a…

PHP基礎-函數

函數是一段可重復使用的代碼塊&#xff0c;可以將一系列操作封裝起來&#xff0c;使代碼更加模塊化、可維護和可重用&#xff0c;來大大節省我們的開發時間和代碼量&#xff0c;提高編程效率。在PHP中你可以使用&#xff1a; 內置函數&#xff08;如 strlen()、array_merge()&a…

【FastAPI高級實戰】結合查詢參數與SQLModel Joins實現高效多表查詢(分頁、過濾、計數)

想象一下&#xff0c;你正在開發一個超酷的Web應用&#xff0c;比如一個博客平臺或者一個在線商店。你的API不僅要能把數據&#xff08;比如文章列表、商品信息&#xff09;展示給用戶&#xff0c;更要聰明到能理解用戶的各種“小心思”&#xff1a;用戶可能想看最新的文章、搜…

華為OD-2024年E卷-通過軟盤拷貝文件[200分] -- python

問題描述&#xff1a; 有一名科學家想要從一臺古董電腦中拷貝文件到自己的電腦中加以研究。但此電腦除了有一個3.5寸軟盤驅動器以外&#xff0c;沒有任何手段可以將文件持貝出來&#xff0c;而且只有一張軟盤可以使用。因此這一張軟盤是唯一可以用來拷貝文件的載體。科學家想要…

Keepalived 高可用,nginx + keepalived , lvs + keepalived、 數據庫+keepalived

keepalived 官網 Keepalived 可以用來防止服務器單點故障的發生 # 原理 是基于VRRP協議實現的&#xff0c;當backup收不到vrrp包時&#xff0c;就認為master宕機了&#xff0c;這時就需要根據VRRP的優先級來選舉一個backup 當master&#xff0c;就實現服務的HA&#xff08;高…

開疆智能Devicenet轉ModbusTCP網關連接臺達從站通訊模塊配置案例

本案例是通過開疆智能Devicenet轉ModbusTCP網關連接臺達Devicenet從站通訊模塊DVPDT02-H2的配置案例&#xff0c;網關作為ModbusTCP服務器和Devicenet主站&#xff0c;連接臺達Devicenet從站&#xff0c; 配置過程&#xff1a; 首先配置Devicenet從站&#xff0c;先設置從站De…

網絡NAT是什么

網絡NAT&#xff08;Network Address Translation&#xff0c;網絡地址轉換&#xff09;是一種用于計算機網絡中的技術&#xff0c;主要目的是在私有網絡與公有網絡&#xff08;比如互聯網&#xff09;之間轉換IP地址&#xff0c;實現私有網絡中的多臺設備通過一個公網IP訪問外…

React狀態管理——react-redux

目錄 一、redux介紹 二、安裝 三、基本實現步驟 3.1 創建Action Types 3.2 創建counterAction 3.3 創建counterReducer 3.4 結合所有Reducer 3.5 創建store 3.6 入口文件中提供store 3.7 在組件中的使用 3.8 使用thunk實現異步支持 3.8.1 安裝 3.8.2 在counterAct…

Java 零工市場小程序 | 靈活就業平臺 | 智能匹配 | 日結薪系統 | 用工一站式解決方案

在就業形勢如此嚴峻的情況下&#xff0c;很多小伙伴都會選擇零工的工作方式來賺取外快&#xff0c;很多用人單位也會因為職為短暫空缺或是暫時人手不夠而選擇招用兼職人員。 而Java 作為企業級開發的主流語言&#xff0c;以其卓越的性能和穩定性著稱。把零工的需求&#xff08…

數據可視化——一圖勝千言

第04篇&#xff1a;數據可視化——一圖勝千言 寫在前面&#xff1a;大家好&#xff0c;我是藍皮怪&#xff01;前面幾篇我們聊了統計學的基本概念、數據類型和描述性統計&#xff0c;這一篇我們要聊聊數據分析中最直觀、最有趣的部分——數據可視化。你有沒有發現&#xff0c;很…