日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

AVL树:解决BST可能导致的长链问题

發布時間:2025/7/25 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 AVL树:解决BST可能导致的长链问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

BST存在的問題

BST的性質有可能導致所有的數據都插在了同一個鏈路上,導致沒有一個節點有左子樹,都是右子樹,像是一個鏈表,失去了它的lgn的性質

AVL的性質

AVL是作者的名字縮寫

每個左子樹的高度與右子樹的高度差值不大于1

如果是AVL+BST需要只需要在BST的基礎上加上AVL的性質,AVL本身需要去維護高度

另為在一個高度為h的AVL中節點的最少的數量,有

一個AVL樹,除去根節點這層,至少包含的左右兩部分為:一邊是高度為h-1,另一邊是高度為h-2

從上式可得:,即h<2lgn,因而得到AVL的高度肯定是lgn

AVL樹+BST的插入

插入過程中,一旦出現層級超過1的情況,需要進行旋轉,而對應出現2層的高度差別,只會出現如下4種

  • 情況1:
1 \ 2 \ 3 需要進行一次左旋2 / \ 1 3 復制代碼
  • 情況2
1 \ 3 / 2 先右旋 1 \ 2 \ 3 再左旋2 / \ 1 3 復制代碼
  • 情況3
3 / 2 / 1 右旋2 / \ 1 3 復制代碼
  • 情況4
3 / 1 \ 2 對1進行左旋3 / 2 / 1 再右旋2 / \ 1 3 復制代碼

保持平衡的算法為

def _reblance(self,node):while node is not None:self._update_height(node)if self._height(node.left) - self._height(node.right) >=2://左子樹要高nodeL = node.left if self._height(nodeL.left) < self._height(nodeL.right)://情況4self._left_roate(nodeL)//情況3+情況4self._right_roate(node)elif self._height(node.right) - self._height(node.left) >=2://右子樹要高nodeR = node.right if self._height(nodeR.left) > self._height(nodeR.right)://情況2self._right_roate(nodeR)//情況1+情況2self._left_roate(node)node = node.parent 復制代碼

左旋

def _left_roate(self,node):'''當前節點的右節點高度-左節點高度>=2從上到下,按照父子一對一對處理'''pivot = node.rightpivot.parent = node.parent if node == self.root:self.root = pivotelse:if node.parent.left is node:pivot.parent.left = pivotelse:pivot.parent.right = pivottempNode = pivot.leftpivot.left = nodenode.parent = pivotnode.right = tempNodeif tempNode is not None:tempNode.parent = nodeself._update_height(pivot)self._update_height(node) 復制代碼

右旋

def _right_roate(self,node):'''當前節點的左節點高度-右節點高度>=2右旋表示左邊節點高'''pivot=node.left pivot.parent = node.parentif node == self.root:self.root=pivotelse:if node.parent.left is node:pivot.parent.left = pivotelse:pivot.parent.right = pivotnode.parent = pivottempNode = pivot.right pivot.right = nodenode.left = tempNodeif tempNode is not None:tempNode.parent = nodeself._update_height(pivot)self._update_height(node) 復制代碼

代碼詳情

總結

以上是生活随笔為你收集整理的AVL树:解决BST可能导致的长链问题的全部內容,希望文章能夠幫你解決所遇到的問題。

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