什么是平衡搜索树 BST

博客介绍了平衡树的定义链接,阐述了判断是否为平衡二叉搜索树(BST)的条件,包括左右子树平衡且高度差不超1,树中节点需排序,还提及了如何构造平衡树。

定义:https://zh.wikipedia.org/wiki/平衡树

如何判断是否是BST:
An empty tree is height-balanced. A non-empty binary tree T is balanced if:

  1. Left subtree of T is balanced
  2. Right subtree of T is balanced
  3. The difference between heights of left subtree and right subtree is not more than 1.
    树中的节点应当是排序过的。

如何构造平衡树:

### 平衡二叉搜索树的定义 平衡二叉搜索树(Balanced Binary Search Tree)是一种特殊的二叉搜索树(Binary Search Tree, BST),它能够在插入和删除操作时自动保持树的平衡性,以确保检索效率始终保持在较高水平。在平衡二叉搜索树中,树的高度被严格控制在 $ O(\log n) $ 的范围内,从而保证了查找、插入和删除操作的时间复杂度接近最优[^2]。 ### 平衡二叉搜索树的原理 平衡二叉搜索树的核心原理是通过特定的平衡调整机制,使得每次插入或删除节点后,树的左右子树高度差不会过大。常见的平衡二叉搜索树包括 **AVL 树** 和 **红黑树**,它们在实现平衡的方式上有所不同: 1. **AVL 树**:通过维护每个节点的平衡因子(Balance Factor, BF),即左右子树的高度差来实现平衡。当插入或删除节点导致某个节点的 BF 绝对值大于 1 时,AVL 树会通过 **旋转操作**(如单旋转、双旋转)来恢复平衡[^4]。 2. **红黑树**:通过为每个节点赋予一个颜色属性(红色或黑色),并遵循一组特定的规则(如根节点为黑色、红色节点的子节点必须为黑色等)来实现近似平衡。红黑树的平衡性不如 AVL 树严格,但其插入和删除操作的旋转次数较少,因此更适合动态数据频繁变化的场景[^3]。 这些平衡机制确保了即使在最坏情况下,查找、插入和删除操作的时间复杂度仍然保持在 $ O(\log n) $,而不是退化到 $ O(n) $,从而维持了高效的数据操作性能[^1]。 ### 示例代码:AVL 树的插入操作 以下是一个简化的 AVL 树插入操作的 Python 实现,展示了如何通过旋转操作保持树的平衡性。 ```python class Node: def __init__(self, key): self.key = key self.left = None self.right = None self.height = 1 # 每个节点的高度属性 class AVLTree: def insert(self, root, key): if not root: return Node(key) elif key < root.key: root.left = self.insert(root.left, key) else: root.right = self.insert(root.right, key) # 更新节点高度 root.height = 1 + max(self.get_height(root.left), self.get_height(root.right)) # 计算平衡因子并平衡树 balance = self.get_balance(root) # 左左情况 if balance > 1 and key < root.left.key: return self.right_rotate(root) # 右右情况 if balance < -1 and key > root.right.key: return self.left_rotate(root) # 左右情况 if balance > 1 and key > root.left.key: root.left = self.left_rotate(root.left) return self.right_rotate(root) # 右左情况 if balance < -1 and key < root.right.key: root.right = self.right_rotate(root.right) return self.left_rotate(root) return root def left_rotate(self, z): y = z.right T2 = y.left y.left = z z.right = T2 z.height = 1 + max(self.get_height(z.left), self.get_height(z.right)) y.height = 1 + max(self.get_height(y.left), self.get_height(y.right)) return y def right_rotate(self, z): y = z.left T3 = y.right y.right = z z.left = T3 z.height = 1 + max(self.get_height(z.left), self.get_height(z.right)) y.height = 1 + max(self.get_height(y.left), self.get_height(y.right)) return y def get_height(self, root): if not root: return 0 return root.height def get_balance(self, root): if not root: return 0 return self.get_height(root.left) - self.get_height(root.right) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值