Python數據結構之平衡二叉樹
前言
平衡二叉樹(AVL樹):空樹,或者任一結點左、右子樹高度差的絕對值不超過1,也即。而平衡因子(BF),其中和分別爲T的左、右子樹的高度。此外,平衡二叉樹是在BST上建立而成。BF公式如下:
LL型(右旋)
圖示
代碼
def right_rotate(node):
"""LL型,右旋"""
if node is None:
return
# 創建新的結點,保存左旋後的結點
new_node = copy.deepcopy(node)
new_node.right = node.right
new_node.left = node.left.right
# 連接新的左右結點
node.val = node.left.val
node.left = node.left.left
node.right = new_node
結果:
LL未平衡: 6 7 8 9 10 12
LL平衡後: 8 7 6 10 9 12
RR型(左旋)
圖示
代碼
def left_rotate(node):
"""RR型,左旋"""
if node is None:
return
# 創建新的結點,保存左旋後的結點
new_node = copy.deepcopy(node)
new_node.left = node.left
new_node.right = node.right.left
# 連接新的左右結點
node.val = node.right.val
node.right = node.right.right
node.left = new_node
結果:
RR未平衡: 3 4 5 6 7 8
RR平衡後: 6 4 3 5 7 8
混合型
圖示
-
LR型
-
RL型
代碼
def jude_node(self, node):
"""判斷二叉樹是否平衡"""
# 1.右子樹高於左子樹,
if self.get_right_height(node) - self.get_left_height(node) > 1:
if node.right and self.get_left_height(node.right) > self.get_right_height(node.right):
# RL型,右旋後左旋
self.right_rotate(node.right)
self.left_rotate(self.root)
else:
self.left_rotate(self.root)
return
# 2.左子樹高於右子樹
if self.get_left_height(node) - self.get_right_height(node) > 1:
if node.left and self.get_right_height(node.left) > self.get_left_height(node.left):
# LR型,左旋後右旋
self.left_rotate(node.left)
self.right_rotate(self.root)
else:
self.right_rotate(self.root)
結果:
LR未平衡: 6 7 8 9 10 11
LR平衡後: 8 7 6 10 9 11
RL未平衡: 7 10 13 14 15 16 17
RL平衡後: 14 10 7 13 16 15 17
參考
數據結構與算法–平衡二叉樹/AVL樹 一步一步帶你用Python完整實現平衡二叉樹/AVL樹 Python實現平衡二叉樹/AVL樹的調整 AVL樹結點/節點的調整