当前位置:首页python > 正文

Python 数据结构:AVL 平衡树(AVL Tree)旋转操作

作者:野牛程序员:2025-12-22 11:08:12python阅读 2005
Python 数据结构:AVL 平衡树(AVL Tree)旋转操作
# /*
# Python 数据结构:AVL 平衡树(AVL Tree)旋转操作
# --------------------------------------------------------
# 概念:
# AVL 树是一种自平衡二叉搜索树(BST),任意节点的左右子树高度差 <= 1。
# 插入或删除节点后,若破坏平衡,需要通过旋转(单旋转或双旋转)恢复平衡。
# 旋转类型:
# 1) 左旋(Left Rotation)
# 2) 右旋(Right Rotation)
# 3) 左右旋(Left-Right Rotation)
# 4) 右左旋(Right-Left Rotation)
# */

# ========================================================
# AVL 树节点定义
# ========================================================
class AVLNode:
    def __init__(self, key):
        self.key = key
        self.left = None
        self.right = None
        self.height = 1  # 节点高度

# ========================================================
# AVL 树操作类(插入 + 平衡 + 旋转)
# ========================================================
class AVLTree:
    def __init__(self):
        self.root = None

    # 获取节点高度
    def _height(self, node):
        if not node:
            return 0
        return node.height

    # 计算平衡因子
    def _balance_factor(self, node):
        return self._height(node.left) - self._height(node.right) if node else 0

    # 右旋(Right Rotation)
    def _right_rotate(self, y):
        x = y.left
        T2 = x.right

        # 执行旋转
        x.right = y
        y.left = T2

        # 更新高度
        y.height = max(self._height(y.left), self._height(y.right)) + 1
        x.height = max(self._height(x.left), self._height(x.right)) + 1

        return x

    # 左旋(Left Rotation)
    def _left_rotate(self, x):
        y = x.right
        T2 = y.left

        # 执行旋转
        y.left = x
        x.right = T2

        # 更新高度
        x.height = max(self._height(x.left), self._height(x.right)) + 1
        y.height = max(self._height(y.left), self._height(y.right)) + 1

        return y

    # 插入节点并保持平衡
    def insert(self, key):
        self.root = self._insert_recursive(self.root, key)

    def _insert_recursive(self, node, key):
        # 普通 BST 插入
        if not node:
            return AVLNode(key)
        if key < node.key:
            node.left = self._insert_recursive(node.left, key)
        elif key > node.key:
            node.right = self._insert_recursive(node.right, key)
        else:
            # 重复节点不插入
            return node

        # 更新高度
        node.height = 1 + max(self._height(node.left), self._height(node.right))

        # 计算平衡因子
        balance = self._balance_factor(node)

        # 左左情况
        if balance > 1 and key < node.left.key:
            return self._right_rotate(node)

        # 右右情况
        if balance < -1 and key > node.right.key:
            return self._left_rotate(node)

        # 左右情况
        if balance > 1 and key > node.left.key:
            node.left = self._left_rotate(node.left)
            return self._right_rotate(node)

        # 右左情况
        if balance < -1 and key < node.right.key:
            node.right = self._right_rotate(node.right)
            return self._left_rotate(node)

        return node

    # 中序遍历(升序)
    def inorder_traversal(self, node=None):
        if node is None:
            node = self.root
        result = []
        def _inorder(n):
            if n:
                _inorder(n.left)
                result.append(n.key)
                _inorder(n.right)
        _inorder(node)
        return result

# ========================================================
# 示例演示
# ========================================================
avl = AVLTree()
for val in [10, 20, 30, 40, 50, 25]:
    avl.insert(val)

print("AVL 树中序遍历(升序):", avl.inorder_traversal())

# ========================================================
# 要点总结:
# --------------------------------------------------------
# 1) AVL 树是一种自平衡 BST,保证每次插入/删除后高度平衡;
# 2) 插入后可能需要单旋转或双旋转调整;
# 3) 左左、右右情况用单旋转解决;
# 4) 左右、右左情况用双旋转解决;
# 5) 平衡因子 = 左子树高度 - 右子树高度;
# 6) 查找操作与普通 BST 相同,O(log n);
# 7) 插入/删除后保持高度平衡确保 O(log n) 时间复杂度。
# */

# AVL 树中序遍历(升序): [10, 20, 25, 30, 40, 50]


野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892
野牛程序员教少儿编程与信息学竞赛-微信|电话:15892516892
  • Python 数据结构:AVL 平衡树(AVL Tree)旋转操作
  • 相关推荐

    最新推荐

    热门点击