平衡二叉樹的調整

平衡二叉樹的定義

平衡二叉樹(balanced binary tree),又稱AVL樹(Adelson-Velskii and Landis)。 一棵平衡二叉樹或者是空樹或者是具有下列性質的二叉排序樹

① 左子樹與右子樹的高度之差的絕對值小于等于1

② 左子樹和右子樹也是平衡二叉排序樹。 為了方便起見,給每個結點附加一個數字,給出該結點左子樹與右子樹的高度差。這個數字稱為結點的平衡因子(BF)。

平衡因子 = 結點左子樹的高度 - 結點右子樹的高度

根據平衡二叉樹的定義,平衡二叉樹上所有結點的平衡因子只能是-1、0,或1

我們分析一下這個二叉樹

對于40,左子樹高度是2(看左子樹有幾層),右子樹高度是3,2-3=-1,所以40的平衡因子是-1,平衡

對于24,左子樹高度是0,對右子樹高度為1,0-1=-1,24的平衡因子是-1,以此類推

我們直接分析一下53,53的左子樹高度是0,右子樹高度是2,所以0-2=-2,失衡

如果在一棵 AVL 樹中插入一個新結點后造成失衡,則必須重新調整樹的結構,使之恢復平衡

平衡調整的四種類型:

C表示的是插入的結點,怎么插入的分了上邊四種類型

調整原則:1)降低高度 2)保持二叉排序樹性質

對于LL型的,對根節點進行順時針旋轉,RR型是根節點A逆時針旋轉

我們也可以通過平衡后要滿足二叉排序樹的性質,比如對上圖的LL型,C<B<A,所以調整的時候,根據左子樹小于根小于右子樹的性質,B作為根,C作為左子樹,A作為右子樹

對上圖的LR型,B<C<A,則C作為根節點,B作為左子樹,A作為右子樹

插入2,2比5小,在左子樹,2比4小,是4的左子樹,插入順序是LL型,發現失衡了,于是將根節點5順時針旋轉下來即可

插入9,發現插入的是RR型,失衡了以后,將根節點4逆時針旋轉,即6作為根節點,4作為6的左子樹,而6的左子樹作為4的右子樹,也就是下圖:

我們發現插入的類型是LR型,那么將葉子節點7升上去,作為根節點,然后3和16比較大小,小的3放入7的左子樹,大的16放入7的右子樹

我們插入8,發現是RL型,將RL型的葉子節點9升上去,7作為9的左子樹,11作為9的右子樹,9原本的左子樹作為7的右子樹

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

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

相關文章

深入解析:如何設計靈活且可維護的自定義消息機制

深入解析&#xff1a;如何設計靈活且可維護的自定義消息機制 引言 在現代軟件開發中&#xff0c;組件間的通信機制至關重要。無論是前端框架中的組件交互&#xff0c;還是后端服務間的消息傳遞&#xff0c;一個良好的消息機制能顯著提升代碼的可維護性和擴展性。本文將深入探討…

PostgreSQL——用戶管理

PostgreSQL用戶管理一、組角色管理1.1、創建組角色1.2、查看和修改組角色1.3、刪除組角色二、角色的各種權限2.1、LOGIN&#xff08;登錄&#xff09;2.2、SUPERUSER&#xff08;超級用戶&#xff09;3.3、CREATEDB&#xff08;創建數據庫&#xff09;3.4、CREATEROLE&#xff…

東軟8位MCU使用問題總結

簡介用的單片機為ES7P7021&#xff0c;采用8位RISC內核&#xff0c;2KB的FLASH&#xff0c;128bit的RAM。編譯器使用東軟提供的iDesigner&#xff0c;開發過程中編譯器和單片機有一些地方使用時需要注意下。1.RAMclear()函數注意問題/****************************************…

深度學習在訂單簿分析與短期價格預測中的應用探索

一、訂單簿數據特性及預處理 1.1 訂單簿數據結構解析 在金融交易領域&#xff0c;訂單簿是市場微觀結構的集中體現&#xff0c;它記錄了不同價格水平的買賣訂單信息。一個典型的訂單簿由多個層級組成&#xff0c;每個層級包含特定價格上的買單和賣單數量。例如&#xff0c;在某…

Hashmap源碼

目錄 HashMap底層原理 JDK1.8及以后底層結構為&#xff1a;數組鏈表紅黑樹 默認參數 擴容機制 數組 鏈表 紅黑樹 HashMap為什么用紅黑樹不用B樹 HashMap什么時候擴容 HashMap的長度為什么是 2的 N 次方 HashMap底層原理 JDK1.8及以后底層結構為&#xff1a;數組鏈表紅…

【JAVA 字符串常量池、new String的存儲機制、==與equals的區別,以及字符串重新賦值時的指向變化】

系列文章目錄 提示&#xff1a;這里可以添加系列文章的所有文章的目錄&#xff0c;目錄需要自己手動添加 提示&#xff1a;寫完文章后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄系列文章目錄代碼原理解錯誤邏輯理解理解與修正&#xff1a…

博客項目 Spring + Redis + Mysql

基礎模塊1. 郵箱發送功能最初設計的接口 &#xff08;雛形&#xff09;public interface EmailService {/*** 發送驗證碼郵件** param email 目標郵箱* return 發送的code* throws RuntimeException 如果發送郵件失敗&#xff0c;將拋出異常*/String sendVerificationCode(Stri…

前端處理導出PDF。Vue導出pdf

前言&#xff1a;該篇主要是解決一些簡單的頁面內容導出為PDF1.安裝依賴使用到兩個依賴&#xff0c;項目目錄下運行這兩個//頁面轉換成圖片 npm install --save html2canvas //圖片轉換成pdf npm install jspdf --save 2.創建通用工具類exportPdf.js文件可以保存在工具類目錄下…

【GM3568JHF】FPGA+ARM異構開發板燒錄指南

1. Windows燒錄說明 SDK 提供 Windows 燒寫工具(工具版本需要 V3.31或以上)&#xff0c;工具位于工程根目錄&#xff1a; tools/ ├── windows/RKDevTool 如下圖&#xff0c;編譯生成相應的固件后&#xff0c;設備燒寫需要進入 MASKROM 或 LOADER 燒寫模式&#xff0c;準備…

C++ 多進程編程深度解析【C++進階每日一學】

文章目錄一、引言二、核心概念&#xff1a;進程 (Process)功能與作用三、C 多進程的實現方式四、核心函數詳解1. fork() - 創建子進程函數原型功能說明返回值完整使用格式2. wait() 和 waitpid() - 等待子進程結束函數原型參數與返回值詳解3. exec 系列函數 - 執行新程序函數族…

一周學會Matplotlib3 Python 數據可視化-繪制面積圖(Area)

鋒哥原創的Matplotlib3 Python數據可視化視頻教程&#xff1a; 2026版 Matplotlib3 Python 數據可視化 視頻教程(無廢話版) 玩命更新中~_嗶哩嗶哩_bilibili 課程介紹 本課程講解利用python進行數據可視化 科研繪圖-Matplotlib&#xff0c;學習Matplotlib圖形參數基本設置&…

北京JAVA基礎面試30天打卡11

1.索引創建注意事項 適合的場景 1.頻繁使用where語句查詢的字段 2.關聯字段需要建立索 3.如果不創建索引&#xff0c;那么在連接的過程中&#xff0c;每個值都會進行一次全表掃描 4.分組和排序字段可以建立索引因為索引天生就是有序的&#xff0c;在分組和排序時優勢不言而喻 5…

vscode無法檢測到typescript環境解決辦法

有一個vitereacttypescript項目&#xff0c;在工作電腦上一切正常。但是&#xff0c;在我家里的電腦運行&#xff0c;始終無法檢測到typescript環境。即使出現錯誤的ts語法&#xff0c;也不會有報錯提示&#xff0c;效果如下&#xff1a;我故意將一個string類型&#xff0c;傳入…

【MCP開發】Nodejs+Typescript+pnpm+Studio搭建Mcp服務

MCP服務支持兩種協議&#xff0c;Studio和SSE/HTTP&#xff0c;目前官方提供的SDK有各種語言。 開發方式有以下幾種&#xff1a; 編程語言MCP命令協議發布方式PythonuvxSTUDIOpypiPython遠程調用SSE服務器部署NodejspnpmSTUDIOpnpmNodejs遠程調用SSE服務器部署… 一、初始化項…

vscode使用keil5出現變量跳轉不了和搜索全局不了

vscode使用keil5出現變量跳轉不了&#xff0c;或者未包含文件&#xff0c;或者未全局檢索&#xff1b; 參考如下文章后還會出現&#xff1b; 為什么vscode搜索欄只搜索已經打開的文件_vscode全局搜索只能搜當前文件-CSDN博客 在機緣巧合之下發現如下解決方式&#xff1a; 下載…

命名空間——網絡(net)

命名空間——網絡&#xff08;net&#xff09; 一、網絡命名空間&#xff1a;每個都是獨立的“網絡房間” 想象你的電腦是一棟大樓&#xff0c;每個網絡命名空間就是大樓里的一個“獨立房間”&#xff1a; 每個房間里有自己的“網線接口”&#xff08;網卡&#xff09;、“門牌…

一文讀懂16英寸筆記本的實際尺寸與最佳應用場景

當您搜索"16寸筆記本電腦長寬"時&#xff0c;內心真正在問的是什么&#xff1f;是背包能否容納&#xff1f;桌面空間是否足夠&#xff1f;還是期待屏幕尺寸與便攜性的完美平衡&#xff1f;這個看似簡單的尺寸數字背后&#xff0c;凝結著計算機制造商對用戶體驗的深刻…

Android Studio中創建Git分支

做一些Android項目時&#xff0c;有時候想要做一些實驗性的修改&#xff0c;這個實驗可能需要很多步驟&#xff0c;所以不是一時半會能完成的&#xff0c;這就需要在實驗的過程中不斷修改代碼&#xff0c;且要提交代碼&#xff0c;方便回滾或比較差異&#xff0c;但是既然是實驗…

內存可見性和偽共享問題

文章目錄什么是內存可見性問題為什么會出現可見性問題解決可見性問題的方法1. 使用volatile關鍵字2. 使用synchronized3. 使用java.util.concurrent包下的原子類什么是偽共享問題CPU緩存行偽共享的危害解決偽共享的方法1. 緩存行填充2. 使用Contended注解&#xff08;JDK 8&…

Spring MVC 九大組件源碼深度剖析(三):ThemeResolver - 動態換膚的奧秘

文章目錄一、主題機制的核心價值二、核心接口設計三、四大實現類源碼解析1. FixedThemeResolver&#xff08;固定主題策略&#xff09;2. CookieThemeResolver&#xff08;Cookie存儲策略&#xff09;3. SessionThemeResolver&#xff08;Session存儲策略&#xff09;4. Abstra…