平衡二叉樹插入操作的詳細過程圖解

二叉搜索樹/二叉排序樹/二叉查找樹

  • 是二叉樹、任意結點的左子樹的值均小於根節點的值,右子樹均大於根節點的值
  • 沒有鍵值相等

    平衡二叉樹(AVL樹)

  • 定義
    • 左右字數的高度差的絕對值不超過1,並且兩子樹都是平衡二叉樹
    • 沒有鍵值相等
    • 高度差,又名平衡因子,範圍爲[-1,0,1],在此規定==平衡因子 bf = 右子樹的高度-左子樹的高度==
  • 插入操作
    1. 當有新的結點插入之前,該樹一定是一個平衡二叉樹
    2. 按照普通搜索樹的方式插入結點cur
    3. 插入之後,調整cur的 parent.bf:插入到左邊 bf --;插入到右邊 bf++;
    4. bf變爲3種值:
      (1)0:插入結束
      (2)-1/1:調整 bf 的過程向上蔓延
      (3 )-2/2:進行修復,
    5. 對失衡的情況進行修復
    6. 插入完成之後,該樹依然是一個平衡二叉樹
  • 具體步驟
    • 通過查找,找到key的合適的位置並將key插入(如果已經存在,則放棄查找)
    • 設置並修改平衡因子

      • 設置新插入的結點 cur 的平衡因子,新插入的結點的平衡因子是 0(未調整的),因爲一定插入在葉子結點
      • 修改 cur 的父節點 parent 的平衡因子 bf
        • 如果cur是parent的左子樹,parent.bf -= 1
        • 如果cur是parent的右子樹,parent.bf += 1
      • 修改parent.bf 之後,parent.bf 的取值範圍爲 [-2,-1,0,1,2]
      • 具體情況如下表:
        在這裏插入圖片描述

      • 對錶格的進一步說明(此處的bf一律指parent.bf):
        • 當bf修改之前是 -1或者 1 ,修改之後變爲 0 時,即在父節點的子樹高度較小的那一邊插入了新結點,使得父結點的左右子樹一樣高,說明本次插入對整棵樹的高度是沒有影響的,即其他結點的平衡因子不會改變,因此插入結束
        • 舉個栗子:在這裏插入圖片描述
        • 當bf修改之前是 0 ,修改之後是 -1 或 1 時,即插入之後導致父結點的左右子樹高度差1,說明這棵子樹的所有父結點的左右子樹的高度都有變化,因此其他結點的平衡因子會發生改變,需繼續向上調整
        • 舉個栗子:在這裏插入圖片描述
        • 當bf修改之前是 -1或 1,修改之後是 -2 或 2時,即插入之後父結點的左右子樹高度差2,已經失衡,需要將當前 parent 進行調整,使之再次保證平衡,進而參考上表做出下一步操作
        • 舉個栗子:在這裏插入圖片描述
    • 失去平衡的調整方法:
      • 解決失衡的方法口訣

        • 左左失衡,parent右旋;
        • 左右失衡,cur左旋,parent右旋;
        • 右右失衡,parent左旋;
        • 右左失衡,cur右旋,parent左旋;
      • 解析:parent爲當前失衡的結點,cur爲parent的孩子(新結點所在的子樹的根節點)
      • eg:在這裏插入圖片描述
      • 四種失衡狀態:
        在這裏插入圖片描述在這裏插入圖片描述
      • 很明顯:如果從根節點到新插入的結點是一路向左,即左左失衡;如果中途向右了,即左右失衡;如果一路向右,即爲右右失衡;如果中途向左了,即右左失衡;
      • 根據不同的失衡,口訣中有不同的解決方法,接下來我們一起來驗證一下吧:
        • ”左左失衡,parent右旋“:
        • 在這裏插入圖片描述
      • “左右失衡,cur左旋,parent右旋”:
      • 在這裏插入圖片描述
      • “右右失衡,parent左旋”:
      • 在這裏插入圖片描述
        • “右左失衡,cur右旋,parent左旋”:
        • 在這裏插入圖片描述
    • 調整之後,該樹還是一個平衡二叉樹
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章