AVL树本质是二叉搜索树,但它又具有以下特点:只能是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树也分别满足同样条件。在AVL树中任何结点的两个子树的高度最大差别为一,所以它也被称为平衡二叉树。
#AVL树(二叉平衡树)
#节点类。AVL树相对一般二叉搜索树,节点增加树高属性,便于判断是否平衡,从而决定是否进行调整等。
class TreeNode(object):
def __init__(self, data, left=None, right=None):
self.data = data
self.left = left
self.right = right
self.height = 0
#AVL树类
class AVLTree(object):
#初始化函数和一般二叉树、二叉搜索树相同,只需创建空的根节点
def __init__(self):
self.root = None
#find为公有方法(可以对外暴露),判断key是否在avl树中。
#与私有的_find相比,增加【树根是否为空】的判断;
#一般二叉搜索树查找也常用这种公有私有机制。
def find(self, key):
#树根为空则返回空,没找到
if not self.root:
return None
#否则传入树的根节点寻找
else:
return self._find(key, self.root)
#私有化方法,寻找以node为根的树或者子树中是否存在键值为key的元素
def _find(self, key, node):
#如果node为空,则无法找到相应key值,返回空
if not node:
return None
#如果要找key小于当前节点数据,到左子树中找
elif key < node.data:
return self._find(key, node.left)
#如果要找的key大于当前节点存储数据,到当前节点的右子树找
elif key > node.data:
return self._find(key, node.right)
#以上(不包括return None)用于递归向下延申,缩小问题规模的过程
#以上条件都不满足,说明这个节点存储的数据与key值相等,也就是找到了相应的元素,将这个节点返回即可
else:
#用于递归向上返回结果过程
#这里的return,是将最后返回的node值一层层原样返回到上一层递归函数,最终返回的就是那个找到的node
return node
#寻找avl树中的最小元素。
#类似地,公有方法增加树根空与否的判断
def findMin(self):
if self.root is None:
return None
#树根不空,返回树的最小值
else:
return self._findMin(self.root)
#私有方法,增加传入参数node便于递归
def _findMin(self, node):
#avl树最小值出现在最左侧的叶子节点。
#只要当前节点还有左孩子节点,左孩子节点就比当前节点小,转到左孩子节点继续向下寻找
if node.left: