AVL树介绍
普通的 二叉搜索树介绍:
https://blog.csdn.net/qq_40831558/article/details/106664884
AVL树的可视化网址
https://www.cs.usfca.edu/~galles/visualization/AVLtree.html
AVL 树是一种平衡二叉树,得名于其发明者的名字( Adelson-Velskii 以及 Landis)。(可见名字长的好处,命名都能多占一个字母出来)。平衡二叉树递归定义如下:
左右子树的高度差小于等于 1。
其每一个子树均为平衡二叉树。
基于这一句话,我们就可以进行判断其一棵树是否为平衡二叉了。
所有代码自己根据原理实现,并未参考其余代码片段,如有错误欢迎指正
实际上在《Data Structures & Algorithms in Python》书中的方法更好,书中给Node定义了两个方法可以避免重复判断left_tnode和right_node是否是None,节约了很多代码。这里只讲一下我的写法,日后再根据别人的写法加以改进。
def _left_height(self):
return self._left._height if self._left is not None else 0
def _right_height(self):
return self._right._height if self._right is not None else 0
Python实现
Node
比起普通的二叉树增加了高度这个属性,用于储存当前Node的高度,方便计算是否平衡
class Node:
def __init__(self,val,height=0):
self.val = val
self.left = None
self.right = None
self.height = height
add
add 代码和普通的二叉树类似,但是增加了一个重平衡的操作self.reBalance()
def add(self,val):
cur = self.head
while True:
if val > cur.val:
if not cur.right:
cur.right = self.Node(val)
break
else:
cur = cur.right
elif val < cur.val:
if not cur.left:
cur.left = self.Node(val)
break
else:
cur = cur.left
else:
raise ValueError('Value is exzist')
self.reBalance()
remove
remove 代码和普通的二叉树类似,但是增加了一个重平衡的操作self.reBalance()
def remove(self,num):
#删除当前节点并返回新的子树,同时确保子树符合二叉树的性质(root.left < root.val < root.right)
def deleteNode(node):
if not node.left:
return node.right
if not node.right:
return node.left
cur = node.right
while cur.left:
cur = cur.left
cur.left = node.left
return node.right
def aux(root):
if not root:
return None
if root.val == nu