📜  自平衡二进制搜索树(比较)(1)

📅  最后修改于: 2023-12-03 14:57:08.204000             🧑  作者: Mango

自平衡二进制搜索树(比较)

自平衡二进制搜索树(Self-Balancing Binary Search Tree)是一种基于二叉搜索树(Binary Search Tree)的数据结构,它的目的是通过动态地进行旋转操作来保持树的平衡,从而达到快速查找、插入、删除的目的。

原理

自平衡二进制搜索树的原理是,通过将较低的节点旋转为根节点的子节点来进行平衡。其平衡操作包括左旋、右旋、双旋等。

举个例子,当在一个普通的二分搜索树中频繁地向其插入相对有序的数据时,树的高度将趋近于一个链表。此时,我们可以通过旋转节点的方式,使得新插入的节点能够尽可能平衡地分布在树的左右两个子树中,从而保持树的高度不会过高,提高树的查找效率。

常见的自平衡二进制搜索树

常见的自平衡二进制搜索树包括:

  1. AVL 树

AVL 树是自平衡二进制搜索树中最早被发明的一种,每个节点保存一个平衡因子,通过左右子树的高度之差判断树是否需要旋转,保持树的平衡。

  1. 红黑树

红黑树是一种更为灵活的自平衡二进制搜索树,通过设置每个节点的颜色、以及对颜色的限制条件来保持树的平衡,其实现更为简洁,并且在实际应用中应用更为广泛。

实现

以下是一个简单的 AVL 树的实现:

class AVLNode:
    def __init__(self, val):
        self.val = val
        self.left = None
        self.right = None
        self.height = 1
    
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):
        if not node:
            return 0
        return self.height(node.left) - self.height(node.right)
    
    def rotate_right(self, node):
        new_root = node.left
        node.left = new_root.right
        new_root.right = node
        
        node.height = 1 + max(self.height(node.left), self.height(node.right))
        new_root.height = 1 + max(self.height(new_root.left), self.height(new_root.right))
        
        return new_root
    
    def rotate_left(self, node):
        new_root = node.right
        node.right = new_root.left
        new_root.left = node
        
        node.height = 1 + max(self.height(node.left), self.height(node.right))
        new_root.height = 1 + max(self.height(new_root.left), self.height(new_root.right))
        
        return new_root
    
    def insert(self, val):
        def helper(node, val):
            if not node:
                return AVLNode(val)
            elif val < node.val:
                node.left = helper(node.left, val)
            else:
                node.right = helper(node.right, val)
                
            node.height = 1 + max(self.height(node.left), self.height(node.right))
            
            # check balance factor and do rotations if necessary
            balance = self.balance_factor(node)
            if balance > 1 and val < node.left.val:
                return self.rotate_right(node)
            elif balance < -1 and val > node.right.val:
                return self.rotate_left(node)
            elif balance > 1 and val > node.left.val:
                node.left = self.rotate_left(node.left)
                return self.rotate_right(node)
            elif balance < -1 and val < node.right.val:
                node.right = self.rotate_right(node.right)
                return self.rotate_left(node)
            
            return node
        
        self.root = helper(self.root, val)
总结

自平衡二进制搜索树实现起来较为复杂,但是在实际应用中其查找、插入、删除等操作的时间复杂度都较为平均,能够满足对高效数据结构的需求。在实际生产环境中,更为灵活、实用的红黑树被广泛应用。