概念介绍
1. 什么是二叉搜索树?
二叉搜索树(Binary Search Tree,BST):也称为二叉排序树或二叉查找树,是一种特殊的二叉树。二叉搜索树是一种高效的动态数据结构,用于存储有序数据,支持快速查找、插入和删除操作。二叉搜索树的核心特性是:通过二叉树结构维护元素的排序关系。
二叉搜索树具有以下特点和性质:
- 节点值特性:对于二叉搜索树中的任意一个节点,设该节点的值为 key,那么它的左子树中所有节点的值都小于 key,右子树中所有节点的值都大于 key。
- 中序遍历特性:对二叉搜索树进行中序遍历(先左子树,再根节点,最后右子树),得到的节点序列是一个递增的有序序列。
// 例如:下面这棵树就是一棵'二叉搜索树'
// 5
// / \
// 3 7
// / \ / \
// 2 4 6 8
2. 二叉搜索树的性能怎么样?
二叉搜索树的效率和形态强相关:
- 最优情况:当二叉搜索树是完全二叉树(或接近完全二叉树)时,树的高度为 log₂N(N 为节点总数)。此时增、删、改、查操作的时间复杂度可达到 O(log N),效率接近二分查找。
- 最差情况:若二叉搜索树退化为单支树(或类似链表的形态),树的高度会退化为 N(节点总数)。此时增、删、改、查操作的时间复杂度会劣化到 O(N),效率甚至不如普通遍历。
显然,单支树形态的效率无法满足实际需求,因此后续会延伸讲解二叉搜索树的变形结构(平衡二叉搜索树),比如 AVL 树和红黑树——这类结构通过自平衡机制,能稳定维持树的高度在 log₂N 级别,更适合内存中数据的存储与搜索场景。
对比二分查找的缺陷: 虽然二分查找也能实现 O(log N) 级别的查找效率,但它存在两大核心缺陷:
- 存储结构限制:二分查找依赖支持下标随机访问的线性结构(如数组),且要求数据有序。
- 插入删除低效:在支持下标随机访问的结构中(如数组),插入/删除操作需要挪动大量数据(为保持有序性),时间复杂度会劣化到 O(N),无法应对高频更新场景。
相比之下,平衡二叉搜索树既保留了二叉搜索树的有序性,又通过自平衡机制规避了单支树的低效问题,同时支持高效的插入、删除与查询,这正是其在工程实践中的核心价值。
基本操作
一、查找操作
思想
查找操作利用二叉搜索树的特性:左子树的所有节点键值小于根节点,右子树的所有节点键值大于根节点,来进行不断地缩小搜索范围。正是这种'分治'思想使得二叉搜索树的查找操作无需遍历全树,大幅提高效率。
步骤
- 创建一个指向根节点的指针。
- 使用 while 循环进行查找键为 key 的节点:
- 情况 1:当前遍历到的节点的键
<目标键 —> '往右子树继续找'。 - 情况 2:当前遍历到的节点的键
>目标键 —> '往左子树继续找'。 - 情况 3:当前遍历到的节点的键
=目标键 —> '找到了要查找的节点'。 - 情况 4:遍历到空节点仍未找到键为 key 的节点 —> '目标键值不存在'。
- 情况 1:当前遍历到的节点的键
简述
从根节点开始寻找指定 key 的节点:若目标值小于当前节点值,则在左子树中继续搜索;若目标值大于当前节点值,则在右子树中继续搜索;若相等,则找到了目标节点。 平均时间复杂度为 O(log n),其中 n 是树中节点的数量。但在最坏情况下(如:树退化为链表),最坏时间复杂度会变为 O(n)。


