返回

AVL树:平衡有序表的力量

后端

序言

对于数据存储而言,索引是至关重要的,它允许我们快速查找和检索数据。索引依赖于字段的有序性,而二叉搜索树正是利用这种顺序来实现高效搜索的。AVL树是一种自平衡二叉搜索树,通过不断调整树的结构以维持平衡,从而确保搜索、插入和删除操作始终在O(log n)的时间复杂度内完成。

AVL树的工作原理

AVL树是一种高度平衡的二叉搜索树,这意味着左右子树的高度差至多为1。它使用以下规则来维护平衡:

  • 平衡因子: 每个节点都有一个平衡因子,表示其左子树和右子树的高度差。
  • 左旋转: 当一个节点的平衡因子为2(左子树高2)时,对该节点进行左旋转。
  • 右旋转: 当一个节点的平衡因子为-2(右子树高2)时,对该节点进行右旋转。

这些旋转操作将节点及其子树重新排列,以减少高度差并恢复树的平衡。

技术指南:构建你的AVL树

类结构:

class AVLNode:
    def __init__(self, value):
        self.value = value
        self.left = None
        self.right = None
        self.height = 1

插入操作:

def insert(self, value):
    # 递归调用,找到插入位置
    if value < self.value:
        if self.left is None:
            self.left = AVLNode(value)
        else:
            self.left = self.left.insert(value)
    else:
        if self.right is None:
            self.right = AVLNode(value)
        else:
            self.right = self.right.insert(value)

    # 更新高度和平衡因子
    self.update_height()
    return self.balance()

删除操作:

def delete(self, value):
    # 找到要删除的节点
    if value < self.value:
        self.left = self.left.delete(value)
    elif value > self.value:
        self.right = self.right.delete(value)
    else:
        # 叶子节点或只有一个子树
        if self.left is None:
            return self.right
        elif self.right is None:
            return self.left

        # 有两个子树,用前驱节点替换该节点
        temp = self.get_predecessor()
        self.value = temp.value
        self.left = self.left.delete(temp.value)

    # 更新高度和平衡因子
    self.update_height()
    return self.balance()

平衡操作:

def balance(self):
    balance_factor = self.get_balance_factor()

    # 左子树重
    if balance_factor == 2:
        # 左子树的左子树重
        if self.left.get_balance_factor() == 1:
            return self.right_rotate()
        # 左子树的右子树重
        else:
            self.left = self.left.left_rotate()
            return self.right_rotate()

    # 右子树重
    elif balance_factor == -2:
        # 右子树的右子树重
        if self.right.get_balance_factor() == -1:
            return self.left_rotate()
        # 右子树的左子树重
        else:
            self.right = self.right.right_rotate()
            return self.left_rotate()

    # 平衡
    return self

结论

AVL树是一种强大的数据结构,它将自平衡的特性与二叉搜索树的高效搜索相结合。通过维护平衡,AVL树确保了O(log n)的时间复杂度,使其成为需要快速和可靠的数据检索和更新的应用场景的理想选择。