二叉搜索树
外观
二叉搜索树简介[编辑 | 编辑源代码]
二叉搜索树(Binary Search Tree, BST)是一种基于二叉树的数据结构,满足以下性质:
- 任意节点的左子树仅包含小于该节点键值的元素
- 任意节点的右子树仅包含大于该节点键值的元素
- 左右子树也必须各自是二叉搜索树
这种结构使得查找、插入、删除操作的平均时间复杂度为,最坏情况下(树退化为链表)为。
基本操作[编辑 | 编辑源代码]
查找[编辑 | 编辑源代码]
从根节点开始递归比较:
- 若目标值等于当前节点值 → 找到
- 若目标值较小 → 进入左子树
- 若目标值较大 → 进入右子树
def search(root, key):
if root is None or root.val == key:
return root
if key < root.val:
return search(root.left, key)
return search(root.right, key)
插入[编辑 | 编辑源代码]
遵循查找逻辑找到合适位置插入新节点,保持BST性质:
TreeNode insert(TreeNode root, int key) {
if (root == null) return new TreeNode(key);
if (key < root.val)
root.left = insert(root.left, key);
else if (key > root.val)
root.right = insert(root.right, key);
return root;
}
删除[编辑 | 编辑源代码]
分三种情况处理:
- 无子节点:直接删除
- 有一个子节点:用子节点替代
- 有两个子节点:用右子树的最小节点替代
TreeNode* deleteNode(TreeNode* root, int key) {
if (!root) return nullptr;
if (key < root->val) {
root->left = deleteNode(root->left, key);
} else if (key > root->val) {
root->right = deleteNode(root->right, key);
} else {
if (!root->left) return root->right;
if (!root->right) return root->left;
TreeNode* minNode = findMin(root->right);
root->val = minNode->val;
root->right = deleteNode(root->right, minNode->val);
}
return root;
}
可视化示例[编辑 | 编辑源代码]
时间复杂度分析[编辑 | 编辑源代码]
操作 | 平均情况 | 最坏情况 |
---|---|---|
查找 | ||
插入 | ||
删除 |
平衡二叉搜索树[编辑 | 编辑源代码]
为防止退化为链表,衍生出自平衡BST:
实际应用案例[编辑 | 编辑源代码]
1. 数据库索引:MySQL的InnoDB使用B+树(BST的扩展) 2. 文件系统:ext文件系统使用B树管理目录结构 3. 游戏开发:场景管理中快速查找对象 4. 网络路由:路由器使用Trie树(BST变种)进行IP查找
练习题[编辑 | 编辑源代码]
<quiz> {二叉搜索树的中序遍历结果是什么性质? |type="()"} + 升序排列 - 降序排列 - 随机顺序 - 按层次排列
{在最坏情况下,二叉搜索树的时间复杂度会退化到? |type="()"} - O(1) - O(log n) + O(n) - O(n log n) </quiz>
进阶技巧[编辑 | 编辑源代码]
- 迭代实现:所有递归操作都可改为用栈实现的迭代版本
- 线程化BST:添加指向前驱/后继节点的指针加速遍历
- 持久化BST:修改时保留历史版本