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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

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

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

BST存在的問題

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

AVL的性質(zhì)

AVL是作者的名字縮寫

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

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

另為在一個高度為h的AVL中節(jié)點的最少的數(shù)量,有

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

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

AVL樹+BST的插入

插入過程中,一旦出現(xiàn)層級超過1的情況,需要進行旋轉,而對應出現(xiàn)2層的高度差別,只會出現(xiàn)如下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):'''當前節(jié)點的右節(jié)點高度-左節(jié)點高度>=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):'''當前節(jié)點的左節(jié)點高度-右節(jié)點高度>=2右旋表示左邊節(jié)點高'''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可能导致的长链问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。