日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

2021-10-11 ! AVL树 及其平衡调整 四种情况 恋上数据结构笔记 (考过)

發布時間:2025/3/20 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2021-10-11 ! AVL树 及其平衡调整 四种情况 恋上数据结构笔记 (考过) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

b站有個up講的很詳細
https://www.bilibili.com/video/BV1xE411h7dd?from=search&seid=11383601726930144190&spm_id_from=333.337.0.0
復習時理解不了了可以直接看一看

文章目錄

    • 最前面
    • 犯的錯誤
    • 為何產生了AVL樹
    • 什么是失衡
    • 添加導致的失衡
    • 刪除導致失衡
    • 統一所有旋轉操作
    • 時間復雜度

最前面

四種情況

  • LL 解決方法:R
  • RR 解決方法 : L
  • LR 解決方法 :LR
  • RL 解決方法: RL
    記得注意旋轉中對結點子樹的處理,別光旋轉了

犯的錯誤

!!!
**我犯的錯誤::有沒有可能旋轉涉及的三個結點不連在一起? 不可能
有沒有可能LL RR LR RL之外的情況?? 不可能 **
需要注意:旋轉中涉及到的三個結點分別是:第一個失衡非父祖先結點,第一個失衡非父祖先結點的左子結點或右子結點,第一個失衡非父祖先結點的左子結點或右子結點的左子結點或右子結點
也就是說,我們旋轉這個操作是針對失衡的那個祖先結點,涉及了三個連在一起的結點,而這三個結點不一定是插入結點本身也不一定是插入結點的父結點(除非插入結點和父結點就是和失衡結點連在一起的那種最簡單結構),我初學時總是覺得這三個點可能不在一起,實際上是混淆了平衡調整的目的是對失衡那個結點的調整,而不一定是對插入結點處,因為插入結點可能本身在很大一顆平衡的AVL子樹中。
所以旋轉的結點是三個相連的結點,自然只有這四種情況

為何產生了AVL樹

//!二叉搜索樹的添加刪除,搜索操作的時間復雜度跟樹的高度有關,為O(h)(相比線性表的O(n)搜索以及添加的話)
//! 滿二叉樹的高度基本是logn,所以滿的二叉搜索樹的時間復雜度也接近O(logn)
//! 但是如果二叉搜索樹建立的順序,輸入是一個有序數組的話,比如1,2,3,4,5,。。。n這樣建立的二叉搜索樹高度就等于n
//! 也就是最壞時間復雜度等于O(n),被稱為二叉搜索樹退化為鏈表

//! 所以我們要盡力維持時間復雜度在O(h)而不是O(n)

//! 平衡的概念:二叉樹結點數量固定,左右子樹高度越接近就越平衡,完全二叉樹和滿二叉樹是最平衡的

//! 所以如何改進我們的二叉搜索樹??
//! 1.改變添加刪除的元素順序,簡介控制樹的高度 2.改善添加元素后的二叉樹,使之更平衡
//! 我們設計的二叉搜索樹是給別人用的,所以添加刪除的順序,我們無法改變,所以我們只能從添加后的二叉樹的平衡改進入手
//! 一顆達到適度平衡的二叉搜索樹 ,我們稱之為平衡二叉搜索樹 比如:AVL樹,紅黑樹
//! AVL樹是以其發明者命名的,發明者是一個蘇聯科學家,AVL樹是最早發明的自平衡二叉搜索樹之—,搜索、添加、刪除的時間復雜度是O(logn)O(logn)
//! 平衡因子:該結點平衡因子等于左子樹高度減去右子樹高度,絕對值小于等于1,即超過1或小于-1,即為失衡,就要自動調整

什么是失衡

要理解AVL樹中的平衡旋轉,首先要理解失衡以及失衡狀態
如下圖為添加導致的失衡,配圖來自 網課 戀上數據結構與算法

添加導致的失衡

注意添加導致失衡,會導致從某一個非父結點的祖先節點開始,后面全部祖先結點都失衡,所以我們讓開始失衡的那個祖先結點達到平衡后,后面的祖先結點就跟著平衡了

下面再具體理解旋轉達到平衡的過程,添加一個結點到紅塊處,T代表一棵子樹

注意:LL指的是三個相連結點的關系

LL – 右旋轉(單旋)
讓 p 成為這顆子樹的根節點

g.left = p.right p.right = g

旋轉后仍然是一顆 二叉搜索樹:T0 < n < T1 < p < T2 < g < T3
且二叉搜索樹恢復平衡

添加單個結點導致的不平衡,只能是祖先結點(g)的平衡因子變成+2或-2,而旋轉操作則以前一個平衡的結點做新的子樹根結點,相當于把g樹下沉一個高度,n樹上升一個高度,±2就變成0了,兩邊就就平衡了

RR – 左旋轉(單旋)


LR -先p結點左旋轉,再g結點右旋轉
就是先掰直,掰成LL的形狀,再按照LL處理就行了

LR -先p結點右旋轉,再g結點左旋轉
就是先掰直,掰成RR的形狀,再按照RR處理就行了

刪除導致失衡

注意添加后經過平衡調整并不會導致新的不平衡出現,因為平衡調整后的結點高度和插入前是一樣的,但是刪除結點的平衡調整會導致調整后結點子樹高度可能減少,導致新的不平衡出現
如果是刪除導致的結點失衡,在afteradd里把break去掉就可以,一直往上查找是否導致了新的祖先結點失衡,反復平衡
而且無論是添加導致的失衡,還是刪除導致的失衡,修復的過程都是找到失衡結點進行旋轉,旋轉的過程也是一樣的,找兩個更高的子樹結點,判斷LL,RR,進行調整

統一所有旋轉操作

搞清楚四種情況對應的abcdefg是誰,從左到右按順序標號,最終四種旋轉的結果位置是一樣的

時間復雜度

總結

以上是生活随笔為你收集整理的2021-10-11 ! AVL树 及其平衡调整 四种情况 恋上数据结构笔记 (考过)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。