Python 数据结构 用Python实现AVL树 不同操作的时间复杂度详解

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
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值