1. 程式人生 > >coding A&D:AVL平衡二叉樹的旋轉(插入結點)

coding A&D:AVL平衡二叉樹的旋轉(插入結點)

【1】AVL平衡二叉樹的基本概念:

平衡二叉樹建立在二叉排序樹的基礎上,目的是使二叉排序樹的平均查詢長度更小,即讓各結點的深度儘可能小,因此,樹中每個結點的兩棵子樹的深度不要偏差太大。

平衡二叉樹的遞迴定義:平衡二叉樹是一棵二叉樹,其可以為空,或滿足如下2個性質:①左右子樹深度之差的絕對值不大於1。②左右子樹都是平衡二叉樹。

平衡因子的概念:結點的平衡因子 = 結點的左子樹深度 — 結點的右子樹深度。若平衡因子的取值為-1、0或1時,該節點是平衡的,否則是不平衡的。

最低不平衡結點的概念:用A表示最低不平衡結點,則A的祖先結點可能有不平衡的,但其所有後代結點都是平衡的。

                                      即:找最低2或-2

【2】平衡化的實現

整個實現過程是通過在一棵平衡二叉樹中依次插入元素(按照二叉排序樹的方式),若出現不平衡,則要根據新插入的結點與最低不平衡結點的位置關係進行相應的調整。分為LL型、RR型、LR型和RL型4種類型,各調整方法如下(下面用A表示最低不平衡結點):

(1)LL型調整

由於在A的左孩子(L)的左子樹(L)上插入新結點,使原來平衡二叉樹變得不平衡,此時A的平衡因子由1增至2。下面圖1是LL型的最簡單形式。顯然,按照大小關係,結點B應作為新的根結點,其餘兩個節點分別作為左右孩子節點才能平衡,A結點就好像是繞結點B順時針旋轉一樣。

(上圖為最簡單的LL型調整)

LL型調整的一般形式如下圖2所示,表示在A的左孩子B的左子樹BL(不一定為空)中插入結點(圖中陰影部分所示)而導致不平衡( h 表示子樹的深度)。這種情況調整如下:①將A的左孩子B提升為新的根結點;②將原來的根結點A降為B的右孩子;③各子樹按大小關係連線(BL和AR不變,BR調整為A的左子樹)。

(上圖為一般形式的LL型調整)

(2)RR型調整

由於在A的右孩子(R)的右子樹(R)上插入新結點,使原來平衡二叉樹變得不平衡,此時A的平衡因子由-1變為-2。圖3是RR型的最簡單形式。顯然,按照大小關係,結點B應作為新的根結點,其餘兩個節點分別作為左右孩子節點才能平衡,A結點就好像是繞結點B逆時針旋轉一樣。

(上圖為最簡單的RR型調整)

RR型調整的一般形式如下圖4所示,表示在A的右孩子B的右子樹BR(不一定為空)中插入結點(圖中陰影部分所示)而導致不平衡( h 表示子樹的深度)。這種情況調整如下:①將A的右孩子B提升為新的根結點;②將原來的根結點A降為B的左孩子;③各子樹按大小關係連線(AL和BR不變,BL調整為A的右子樹)。

(上圖為一般形式的RR型調整)

(3)LR型調整

由於在A的左孩子(L)的右子樹(R)上插入新結點,使原來平衡二叉樹變得不平衡,此時A的平衡因子由1變為2。圖5是LR型的最簡單形式。顯然,按照大小關係,結點C應作為新的根結點,其餘兩個節點分別作為左右孩子節點才能平衡。

(最簡單的LR型調整)

LR型調整的一般形式如下圖6所示,表示在A的左孩子B的右子樹(根結點為C,不一定為空)中插入結點(圖中兩個陰影部分之一)而導致不平衡( h 表示子樹的深度)。這種情況調整如下:①將C的右孩子B提升為新的根結點;②將原來的根結點A降為C的右孩子;③各子樹按大小關係連線(BL和AR不變,CL和CR分別調整為B的右子樹和A的左子樹)。

(一般形式的LR型調整)

(4)RL型調整

由於在A的右孩子(R)的左子樹(L)上插入新結點,使原來平衡二叉樹變得不平衡,此時A的平衡因子由-1變為-2。圖7是RL型的最簡單形式。顯然,按照大小關係,結點C應作為新的根結點,其餘兩個節點分別作為左右孩子節點才能平衡。

(最簡單的RL型調整)

RL型調整的一般形式如下圖8所示,表示在A的右孩子B的左子樹(根結點為C,不一定為空)中插入結點(圖中兩個陰影部分之一)而導致不平衡( h 表示子樹的深度)。這種情況調整如下:①將C的右孩子B提升為新的根結點;②將原來的根結點A降為C的左孩子;③各子樹按大小關係連線(AL和BR不變,CL和CR分別調整為A的右子樹和B的左子樹)。

(一般形式的RL型調整)

平衡二叉樹的深度接近log2n的數量級,從而保證在二叉排序樹上插入、刪除和查詢等操作的平均時間複雜度為O(log2n)。

練習題:

這裡寫圖片描述

其中,對於第10步插入18後,為什麼要進行調整,剛開始理解有偏差,還疑惑了好一陣。後來才發現,自己對平衡因子的理解出錯了。

找平衡因子,平衡因子看哪個值先為-2(哪個根左右子樹或子樹高度差超過1,這個根的平衡因子就為-2,並且如果有兩個平衡因子-2的,旋轉那個靠近插入值那邊的那個根) 
這裡寫圖片描述 
如圖所示,節點16的平衡因子為-2,產生了不平衡,因此從16開始調整(旋轉),執行RL調整。

其他練習:

相關推薦

coding A&DAVL平衡旋轉插入結點

【1】AVL平衡二叉樹的基本概念: 平衡二叉樹建立在二叉排序樹的基礎上,目的是使二叉排序樹的平均查詢長度更小,即讓各結點的深度儘可能小,因此,樹中每個結點的兩棵子樹的深度不要偏差太大。 平衡二叉樹的遞迴定義:平衡二叉樹是一棵二叉樹,其可以為空,或滿足如下2個性質:①左右子

coding A&D森林與的轉換

首先,樹轉二叉樹: 「1」兄弟+橫線  樹中的每一個結點,如果該結點有兄弟結點,那麼就在這幾個兄弟結點之間進行連線。 「2」儲存長子線  對於樹中的每一個結點,如果其有多個子節點,儲存其第一個子節點的連線,去除其他子節點的連線。 「3」調整位置  對每個結點

#資料結構與演算法學習筆記#劍指Offer35是否平衡/AVL + 測試用例Java、C/C++

2018.11.3 前幾天有用遞迴實現了二叉樹的深度#資料結構與演算法學習筆記#劍指Offer36:二叉樹的深度(Java),因此可以對每個結點先序遍歷進行一次平衡驗證,只要確定每個結點都是平衡的

AVL平衡的各種問題Balanced Binary Tree

AVL樹或者是一棵空樹,或者是具有以下性質的非空二叉搜尋樹: 1. 任一結點的左、右子樹均為AVL樹; 2.根結點左、右子樹高度差的絕對值不超過1.   1.宣告 #include<iostream> #include<cstdio> #inc

AVL平衡,紅黑原理。

二叉搜尋樹 插入和刪除操作必須先查詢,查詢效率代表了二叉搜尋樹中各個操作的效能 最優情況:二叉搜尋樹為完全二叉樹,比較次數Log2^N 最壞情況:二叉搜尋樹為單支樹,平均比較次數N/2 平衡二叉樹 平衡樹: AVL樹,紅黑樹 AVL樹:(二叉搜尋樹改良版)

AVL平衡總結

我個人是通過b站學習的懂得 b站視訊連線: https://www.bilibili.com/video/av37955102?from=search&seid=14638889623357631324 https://www.bilibili.com/video/av379

資料結構中常見的BST搜尋AVL平衡、RBT紅黑、B-、B+、B*

BST樹 即二叉搜尋樹:        1.所有非葉子結點至多擁有兩個兒子(Left和Right);        2.所有結點儲存一個關鍵字;        3.非葉子結點的左指標指向小於其關鍵字的子樹,右指標指向大於其關鍵字的子樹; 如:      

AVL平衡旋轉操作的本質及其實現

1.AvlTree的定義            AVL (Adelson Velskii和 Landis)樹是帶有平衡條件的二叉查詢樹。這個平衡條件必須容易保持,而且它必須保證樹的深度是O(log N)。最簡單的想法是要求左右子樹具有相同的高度。     一般限制為:一棵

AVL平衡總結+java實現

目錄 普通二叉搜尋樹的問題 AVL樹定義 AVL樹和節點的結構  AVL樹高度計算方法 AVL樹旋轉 LL 右旋轉 RR 左旋轉 LR 左旋右旋 RL 右旋左旋 平衡節點 插入節點 刪除節點 查詢最大最小節點 刪除 完整程式碼

資料結構之AVL平衡

平衡二叉樹(Balanced Binary Tree)又被稱為AVL樹(有別於AVL演算法),且具有以下性質:它是一 棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,並且左右兩個子樹都是一棵平衡二叉樹。這個方案很好的解決了二叉查詢樹退化成連結串列的問題,把插入,查詢,刪除的時間複雜度最

AVL平衡c++實現

#include <iostream> #include <algorithm> #include <stack> #include <vector> using namespace std; typedef

Python刷leetcode110. 平衡

給定一個二叉樹,判斷它是否是高度平衡的二叉樹。本題中,一棵高度平衡二叉樹定義為:一個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過1。示例 1:給定二叉樹 [3,9,20,null,null,15,7] 3 / \ 9 20 / \ 1

AVL-平衡的原理和實現

一、簡介   本文將通過圖解和程式碼詳細講解AVL平衡二叉樹的性質及失衡和再平衡的內容。在看本文之前希望大傢俱備二分搜尋樹的相關知識。或移步《二分搜尋樹》瞭解二分搜尋樹。   二、平衡二叉樹   前面關於二分搜尋樹的文章,最後分析了在極端情況下,二分搜尋樹會退化為一個連結串列,那為了避免這種

3.1 C語言_實現AVL平衡

【序】 上節我們實現了資料結構中最簡單的Vector,那麼來到第三章,我們需要實現一個Set set的特點是 內部有序且有唯一元素值;同時各種操作的期望操作時間複雜度在O(n·logn); 那麼標準的C++ STL(Standard Template Library)  容器內部使用的是什麼呢? S

動畫演示平衡旋轉

我們知道在二叉查詢樹中,如果插入元素的順序接近有序,那麼二叉查詢樹將退化為連結串列,從而導致二叉查詢樹的查詢效率大為降低。如何使得二叉查詢樹無論在什麼樣情況下都能使它的形態最大限度地接近滿二叉樹以保證它的查詢效率呢? 前蘇聯科學家G.M. Adelson-Velskii 和 E.M. Landis給出了

平衡旋轉原理(圖示)

/************************************************************************* > File Name: btree.h > Author: zhouli

平衡旋轉

平衡二叉樹(Balanced Binary Tree)是二叉查詢樹的一個進化體,也是第一個引入平衡概念的二叉樹。1962年,G.M. Adelson-Velsky 和 E.M. Landis發明了這棵樹,所以它又叫AVL樹。平衡二叉樹要求對於每一個節點來說,它的左右子樹

《資料結構》實驗五 實驗實驗報告

一.實驗目的      鞏固樹和二叉樹的相關知識,特別是二叉樹的相關內容。學會運用靈活應用。 1.回樹和二叉樹的邏輯結構和儲存方法,清楚掌握樹和二叉樹的遍歷操作。 2.學習樹的相關知識來解決實際問題。 3.進一步鞏固程式除錯方法。 4.進一步鞏固模板程式設計。

平衡旋轉詳解

平衡二叉樹的定義(AVL)定義 平衡二叉樹或者是一棵空樹,或者滿足以下的性質:它的左子樹和右子樹的高度之差的絕對值不超過1,並且左子樹和右子樹也是一個平衡二叉樹。 平衡因子 左子樹高度減去右子樹的

第六章作業1—--計算機17級 6-1 求高度 20 分

6-1 求二叉樹高度 (20 分) 本題要求給定二叉樹的高度。 函式介面定義: int GetHeight( BinTree BT ); 其中BinTree結構定義如下: typedef struct TNode *Position; typedef P