藍橋備賽(18)- 紅黑樹和 set 與 map(上)

對于二叉搜索樹 , 平衡二叉樹 , 以及紅黑樹 , 目前只需要了解背后的原理 , 不做代碼實現的要求 , 重要的就是了解各種操作的時間復雜度即可 , 為set 與 map 做鋪墊

?

一、二叉搜索樹

1.1 基本概念

相較與于堆,二叉搜索樹是大小關系更為嚴格的數據結構。但是并不需要必須是?棵完全二叉樹,也就是樹的形態是任意的。如下圖所示,都是二叉搜索樹!

構造一棵二叉搜索樹的目的? , 并不是為了排序,而是為了提高查找和輸入刪除關鍵字的速度。

1.2 查找操作

二叉搜索樹的查找是從根結點開始 ,沿某個分支逐層向下比較的過程,若二叉搜索樹非空,先將給定值與根結點的關鍵字比較,若相等,則查找成功;若不等,如果小于根結點的關鍵字,則在根結點的左子樹上查找,否則在根結點的右子樹上查找。二這也是?個遞歸的過程。
根據BST的特性(左 < 根 < 右 )
從根結點開始一路向下找
最壞情況下會從根節點開始,查找到葉子結點。因此時間復雜度是和樹的高度有關的,而樹高最差會 變成一條單鏈表,因此時間復雜度為 O(N)

1.3 插入操作

根據BST的特性(左 < 根 < 右 )
從根結點開始一路向下找,找到合適的位置,就直接插入
插入與查找的過程一致,因此時間復雜度為 O(N)?

1.4 構造 BST 樹

二叉搜索樹的構建就是不斷向原來的樹中插入新的結點即可。

根據序列 a = {51, 68, 59, 27, 25, 33, 75, 70} ,構造?棵二叉排序樹

所以時間復雜度最優的情況下是 : O(logN)
根據序列 a = {25, 27, 33, 59, 75, 51, 70, 68} ,構造?棵二叉排序樹

在極端條件下 , 時間復雜度為 O(N)? --->?oh my god ! 驟增了!!!??

在上面兩個構造二叉排序樹的過程中 , 雖然結點的值都相同 , 不同的構造順序會有不同的二叉搜索樹 , 會影響查找和插入的效率 。 并且 , 構造序列越有序 , 二叉搜索樹的查找效率就越低 。

1.5 刪除操作

對于第三個刪除結點的情況 , 我們一般是把它變成情況一或二

1)若被刪除結點是葉子結點,則直接刪除? ?

----> 此時依舊會保持二叉搜索樹的性質

2)若被刪除結點只有左子樹或者右子樹,讓左子樹或者右子樹替代

??----> 此時依舊會保持二叉搜索樹的性質

3)若被刪除結點有左子樹和右子樹

刪除 50 這個結點,并用直接前驅來替代

刪除 50 這個結點,并用直接后繼來替代

刪除10這個結點:

注意:我們創建二叉搜索樹其實并不是為了排序 , 而是為了快速插入、刪除 以及查找元素。因為BST不是那么極端的話 , 樹高維持在? logN 的范圍 , 上述的各種操作其實是很快的 。 但是二叉搜索樹的特性并不杜絕極端情況的出現 !!!

二、平衡二叉樹

在介紹二叉搜索樹的時候 ,?在某些特定的情況下 , 二叉搜索樹是會退化成單鏈表 , 并且各種操作的效率也會明顯下降 因此我們需要一些特別的手段保證這個二叉搜素樹的“平衡”,進而保證各種操作的效率 。

2.1 基本概念

平衡二叉樹 , 也稱AVL樹 , 它是具有以下性質的二叉搜索樹

1 ) 左右子樹的高度差的絕對值不超過1

2 ) 左右子樹分別也是平衡二叉樹

如下圖所示 , 結點上方的數字表示平衡因子 。 左圖是一棵平衡二叉樹,右圖不是!

2.2 查找操作

平衡二叉樹的查找 、 插入 以及 刪除操 作基本上與二叉搜索樹一致?, 但是需要處理操作之后的“失衡”

重點需要掌握兩種處理失衡的操作:

1) 左旋

2) 右旋

由于平衡二叉樹會限制樹的高度不會過高? ,趨近于 log n 級別 , 因此時間復雜度為 O(logN)

左旋(結點1)的時候遇到(結點2)?“擋著了” ,?

1 ) 結點1?成為右孩子的左子樹

2 ) 右孩子原本的左子樹(結點2)成為該結點(結點1)的右子樹

右旋(結點1)的時候遇到(結點2)?“擋著了” ,?

1 ) 結點1?成為左孩子的右子樹

2 ) 左孩子原本的右子樹(結點2)成為該結點(結點1)的左子樹

2.3 插入操作

最小不平衡子樹:
在?叉搜索樹中插入新結點之后,插入路徑的點中,可能存在很多平衡因子的絕對值大于 1 的,此時找到 距離插入結點最近的不平衡的點 以這個點為根的 子樹 就是 最小不平衡子樹

2.3.1 LL型 - 右單旋

LL 表示: 新結點由于插入在 T 結點的左孩子(L)的左子樹(LL)中 ,從而導致失衡。如下圖所示:

T失衡了: ---> 讓失衡點右旋

案例:?

2.3.2 RR型 - 左單旋

RR 表示:新結點由于插入在 T 結點的右孩子(R)的右子樹(RR)中,從而導致失衡。如下圖所示:

?T失衡了---> 讓失衡點左旋?

案例:

2.3.3 LR型 - 左右雙旋

LR 表示:新結點由于插入在 T 結點的左孩子(L)的右子樹(LR)中,從而導致失衡。如下圖所示:

?T失衡了: -->

1) 失衡點左孩子左旋

2) 失衡點右旋?

案例:?

2.3.4 RL型 - 右左雙旋

RL 表示:新結點由于插入在 T 結點的右孩子(R)的左子樹(RL)中,從而導致失衡。如下圖所示:

?T失衡了: -->

1) 失衡點的右孩子右旋

2) 失衡點左旋?

案例:?

2.4 構造ALV樹

平衡二叉樹的構造 , 就是不斷向數中插入新的結點

根據序列 a = {15, 6, 10, 17, 11, 13, 9, 20, 16, 22} ,構造一棵二叉排序樹

2.5 刪除操作

與插入操作的思想類似,都是先按照二叉搜索樹的形式操作,然后想辦法使其平衡。具體步驟:
刪除結點的時候 , 調整可能不止一次 , 因為插入的時候,我們是從根結點開始查找合適的插入位置 , 是符合BST的特性 , 但是刪除操作的時候 , 是隨機的 。

?例一:刪除 30

葉子結點直接刪除,刪除之后向上到根節點,所有結點都沒有失衡,直接結束。

??例二:刪除 10?

第?次調整:從 10 向上找,第?個不平衡子樹是以 49 為根的子樹,高度最高的兒子是 59,高度最高的孫子是 69,呈現右孩子右孩子,因此僅需對 59 左旋?次。

沒有第二次調整了,因為所有都已經平衡了?

??例三:刪除 57?

第?次調整:從 57 向上找,第?次出現的不平衡子樹是以 49 為根的子樹,高度最高的兒子是
45,高度最高的孫子是 47,呈現左孩子右孩子,因此需要讓 47 左旋?次,然后再右旋?次:

?

?

第二次調整:從 47 向上找,發現 59 失衡,找到最高的孩子為 69 號結點,最高的孫子為 76 號結
點,呈現的關系是右孩子右孩子,因此將 69 左旋?次:

?

調整結束,因為已經到了根結點,并且根節點是平衡的。?

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

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

相關文章

【Synchronized】不同的使用場景和案例

【Synchronized】不同的使用場景和案例 【一】鎖的作用范圍與鎖對象【1】實例方法&#xff08;對象鎖&#xff09;【2】靜態方法&#xff08;類鎖&#xff09;【3】代碼塊&#xff08;顯式指定鎖對象&#xff09;【4】類鎖&#xff08;通過Class對象顯式鎖定&#xff09; 【二】…

大模型在原發性急性閉角型青光眼預測及治療方案制定中的應用研究報告

目錄 一、引言 1.1 研究背景與意義 1.2 研究目的與方法 1.3 國內外研究現狀 二、原發性急性閉角型青光眼概述 2.1 疾病定義與分類 2.2 發病機制與危險因素 2.3 癥狀與診斷方法 三、大模型在原發性急性閉角型青光眼預測中的應用 3.1 大模型原理與優勢 3.2 術前風險預…

【藍橋杯—單片機】第十五屆省賽真題代碼題解析 | 思路整理

第十五屆省賽真題代碼題解析 前言賽題代碼思路筆記競賽板配置建立模板明確基本要求顯示功能部分頻率界面正常顯示高位熄滅 參數界面基礎寫法&#xff1a;兩個界面分開來寫優化寫法&#xff1a;兩個界面合一起寫 時間界面回顯界面校準校準過程校準錯誤顯示 DAC輸出部分按鍵功能部…

Vue3實戰學習(Vue3快速搭建后臺管理系統(網頁頭部、側邊導航欄、主體數據展示區的設計與實現)(超詳細))(9)

目錄 一、Vue3工程環境配置、項目基礎腳手架搭建、Vue3基礎語法、Vue3集成Element-Plus的詳細教程。(博客鏈接如下) 二、Vue3集成Element-Plus詳細教程。(博客鏈接如下) 三、Vue3集成Vue-Router詳細教程。(博客鏈接如下) 四、Vue3快速搭建后臺管理系統。(實戰學習) &#xff08…

halcon機器人視覺(四)calibrate_hand_eye_stationary_3d_sensor

目錄 一、準備數據和模型二、按照表面匹配的的結果進行手眼標定三、根據標定結果計算CalObjInCamPose一、準備數據和模型 1、讀3D模型:read_object_model_3d 2、創建表面匹配模板:create_surface_model 3、創建一個HALCON校準數據模型:create_calib_data read_object_mode…

【菜鳥飛】通過vsCode用python訪問deepseek-r1等模型

目標 通過vsCode用python訪問deepseek。 環境準備 沒有環境的&#xff0c;vscode環境準備請參考之前的文章&#xff0c;另外需安裝ollama&#xff1a; 【菜鳥飛】用vsCode搭建python運行環境-CSDN博客 AI入門1&#xff1a;AI模型管家婆ollama的安裝和使用-CSDN博客 選讀文章…

vue中,watch里,this為undefined的兩種解決辦法

提示&#xff1a;vue中&#xff0c;watch里&#xff0c;this為undefined的兩種解決辦法 文章目錄 [TOC](文章目錄) 前言一、問題二、方法1——使用function函數代替箭頭函數()>{}三、方法2——使用that總結 前言 ?????盡量使用方法1——使用function函數代替箭頭函數()…

【如何使用云服務器與API搭建專屬聊天系統:寶塔面板 + Openwebui 完整教程】

文章目錄 不挑電腦、不用技術&#xff0c;云服務器 API 輕松搭建專屬聊天系統&#xff0c;對接 200 模型&#xff0c;數據全在自己服務器&#xff0c;安全超高一、前置準備&#xff1a;3 分鐘快速上手指南云服務器準備相關賬號注冊 二、手把手部署教程&#xff08;含代碼塊&a…

使用 PresentMon 獲取屏幕幀率

PresentMon是一個用于捕獲和分析Windows上圖形應用程序高性能特性的工具集,最初由GameTechDev開發,現由英特爾維護和推廣。PresentMon能夠追蹤關鍵性能指標,如CPU、GPU和顯示器的幀持續時間和延遲等,并支持多種圖形API(如DirectX、OpenGL和Vulkan)以及不同的硬件配置和桌…

基金交易系統的流程

1. 賬戶管理 開戶&#xff1a;投資者在基金銷售機構&#xff08;如銀行、券商或第三方平臺&#xff09;開立基金賬戶和資金賬戶。賬戶驗證&#xff1a;驗證投資者身份&#xff0c;綁定銀行卡或其他支付方式。 2. 交易申請 投資者下單&#xff1a;通過交易終端&#xff08;APP…

vue2雙向綁定解析

Vue 2 的雙向綁定原理基于 Object.defineProperty&#xff0c;核心源碼在 src/core/observer 目錄中。 1. 核心模塊&#xff1a;observer observer 模塊負責將普通對象轉換為響應式對象&#xff0c;主要包括以下文件&#xff1a; index.js&#xff1a;定義 Observer 類&#…

中級軟件設計師2004-2024軟考真題合集下載

中級軟件設計師2004-2024軟考真題合集下載 &#x1f31f; 資源亮點&#x1f3af; 適用人群&#x1f4a1; 資源使用指南&#x1f4cc; 資源獲取方式 &#x1f31f; 資源亮點 「中級軟件設計師歷年真題及答案解析&#xff08;2004-2024&#xff09;」 是全網最全、最新的備考資料…

艾爾登復刻Ep1——客戶端制作、場景切換、網絡控制

需要添加的插件內容 Netcode for GameObjects&#xff1a;是一個為 Unity 游戲開發提供高級網絡功能的 SDK。它的主要作用是允許開發者在其 GameObject 和 MonoBehaviour 工作流中集成網絡功能&#xff0c;并且可以與多種底層傳輸層協議兼容。 具體內容請看&#xff1a;https:…

2025探索短劇行業新可能報告40+份匯總解讀|附PDF下載

原文鏈接&#xff1a;https://tecdat.cn/?p41043 近年來&#xff0c;短劇以其緊湊的劇情、碎片化的觀看體驗&#xff0c;迅速吸引了大量用戶。百度作為互聯網巨頭&#xff0c;在短劇領域積極布局。從早期建立行業專屬模型冷啟動&#xff0c;到如今構建完整的商業生態&#xf…

正常的一個編碼器的架構是怎么樣,有哪些模塊構成

正常的一個編碼器架構及其模塊構成 在音視頻編碼器&#xff08;Video Encoder&#xff09;中&#xff0c;通常包括多個核心模塊&#xff0c;整個編碼器架構遵循 輸入 -> 預處理 -> 編碼核心 -> 碼流封裝 的流程。 1. 編碼器的整體架構 編碼器的主要架構如下&#xf…

文件解析漏洞練習

iis6的目錄解析漏洞 (.asp目錄中的所有文件都會被當做asp文件執行) 1.在iis的網站根目錄新建一個名為x.asp的文件 2.在x.asp中新建一個jpg文件。內容為<%now()%> asp代碼。 3.在外部瀏覽器中訪問windows2003的iis網站中的2.jpg 發現asp代碼被執行 iis6的分號截斷解析漏洞…

SQL Server性能優化實戰:從瓶頸定位到高效調優

引言 在數據庫應用中,性能問題直接影響用戶體驗和系統穩定性。本文基于實際案例,分享SQL Server性能優化的關鍵步驟與實用技巧,涵蓋問題定位、索引優化、查詢調優等多個維度。 目錄 引言 一、性能瓶頸定位 1.1 監控工具使用 二、索引優化實戰 2.1 索引碎片整理 2.2 缺…

【DNS系列】使用TCP傳輸

DNS ?默認使用UDP協議?&#xff08;端口53&#xff09;進行通信&#xff0c;但在以下場景中會切換到TCP協議?&#xff08;端口53&#xff09;&#xff1a; ?1. 響應數據過大&#xff08;超過512字節&#xff09;? ?UDP限制&#xff1a;DNS的UDP協議默認限制單個數據包大…

Go Ebiten小游戲開發:俄羅斯方塊

在這篇文章中&#xff0c;我們將一起開發一個簡單的俄羅斯方塊游戲&#xff0c;使用Go語言和Ebiten游戲庫。Ebiten是一個輕量級的游戲庫&#xff0c;適合快速開發2D游戲。我們將逐步構建游戲的基本功能&#xff0c;包括游戲邏輯、圖形繪制和用戶輸入處理。 項目結構 我們的項…

MySQL中IN關鍵字與EXIST關鍵字的比較

文章目錄 **功能等價性分析****執行計劃分析**&#xff1a; **1. EXISTS 的工作原理****步驟拆解**&#xff1a; **2. 為什么需要“利用索引快速定位”&#xff1f;****索引作用示例**&#xff1a; **3. 與 IN 子查詢的對比****IN 的工作方式**&#xff1a;**關鍵差異**&#x…