AVL树是可以自平衡的二叉搜索树(参考:二叉搜索(排序)树的python实现)
AVL树的性质:
1、树的每个节点的左右子树的高度差的绝对值小于等于1
2、AVL树是一种特殊的二叉搜索树
当插入一个节点时候,可能会导致AVL树的失衡,此时可以通过左旋、右旋、先左旋再右旋和先右旋再左旋的4种方法保持树的平衡
class AVL_node(Node):
def __init__(self,val):
Node.__init__(self,val)
self.bf=0 #平衡因子
class AVL(BST):
def __init__(self,node_list):
BST.__init__(self,node_list)
左旋
def rotate_left(self,a,b): #左旋
a.rt=b.lt
if b.lt:
b.lt.parent=a
a.parent=b
b.lt=a
a.bf=0 #更新平衡因子
b.bf=0
右旋
def rotate_right(self,a,b): #右旋
if b.rt:
b.rt.parent=a
a.lt=b.rt
b.rt=a
a.parent=b
a.bf=0 #更新平衡因子
b.bf=0
先左旋再右旋
def rotate_lt_rt(self,a,b):
c=b.rt #左旋
if c.lt:
c.lt.parent=b
b.rt=c.lt
c.lt=b
b.parent=c
if c.rt: #右旋
c.rt.parent=a
a.lt=c.rt
a.parent=c
c.rt=a
if c.bf<0: #更新平衡因子
a.bf=0
b.bf=1
else:
a.bf=-1
b.bf=0
先右旋再左旋
def rotate_rt_lt(self,a,b): #右旋 左旋
c=b.lt #右旋
if c.rt:
c.rt.parent=b
b.lt=c.rt
b.parent=c
c.rt=b
if c.lt: #左旋
c.lt.parent=a
a.rt=c.lt
a.parent.c
c.lt=a
if c.bf>0: #更新平衡因子
a.bf=0
b.bf=-1
else:
a.bf=1
b.bf=0