在计算机科学的数据结构领域,二叉搜索树(Binary Search Tree,简称 BST)是一种具备特殊性质的二叉树结构,其在众多算法及应用中均发挥着举足轻重的作用。
什么是二叉搜索树
二叉搜索树是一种特殊的二叉树,具有以下关键特性:
- 对于树中的每个节点而言:
- 其左子树中的所有节点的值均小于该节点的值。
- 其右子树中的所有节点的值均大于该节点的值。
- 并且,左子树和右子树自身也都是二叉搜索树。
这种独特的结构特性,使得二叉搜索树极为适合用于快速执行数据的查找、插入和删除操作。
重要性质及优势
高效的查找操作
- 凭借二叉搜索树的特性,在查找特定值的节点时,能够通过持续比较目标值与当前节点值的大小,从而决定是向左子树还是右子树进一步搜索。
- 平均情况下,查找操作的时间复杂度为 O ( l o g n ) O(log n) O(logn),其中 n n n 为树中节点的数量。然而,在最坏的情形下,倘若二叉搜索树退化为一条链(例如插入节点的顺序是有序的),查找的时间复杂度则会退化为 O ( n ) O(n) O(n)。
快速的插入和删除操作
- 进行插入操作时,同样通过比较目标值与当前节点值的大小,寻找到适宜的插入位置,而后将新节点插入到相应之处。
- 删除操作相对较为复杂,但也能够依据节点的位置以及子树的情况进行高效处理。
-
若目标节点为叶子节点,直接予以删除即可。
-
若目标节点仅有一个子节点,用子节点替代它即可。
-
若目标节点拥有两个子节点,则存在两种处理方式。
- 以左子树的最大值替换目标节点。
- 用右子树的最小值替换目标节点。
-
示例
数据
我们先随意给定一串序列
插入
- 初始时,树中无节点,直接插入即可
- 接着按照规则依次插入
- 最终形成如下结构,满足上述 BST 的性质
删除
- 目标节点为叶子节点
- 目标节点只有一个子节点
- 目标节点有两个子节点
节点 5 左子树的最大值和右子树的最小值分别为 4、6。按两种方式均可实现
倘若要删除根节点,原理相同,左子树的最大值和右子树的最小值分别为 2、4,同样按两种方式均可
注意: 这两种删除方式会形成不同的树结构
性能退化
于二叉搜索树(BST)的应用之中,有一个需要重点关注的问题,那便是性能退化。尽管 BST 在理想状况下具备出色的性能,但其性能并非始终稳定。
性能退化指的是 BST 由于特定的插入和删除操作序列,致使其结构失去平衡,进而使得各类操作的时间复杂度从期望的 O ( l o g n ) O(log n) O(logn) 恶化为 O ( n ) O(n) O(n)。
造成性能退化的主要原因
-
有序插入或删除:倘若插入或删除的元素依照有序的顺序进行,比如从小到大或者从大到小,那么 BST 可能会逐渐退化为一条链状结构。例如,连续插入 1, 2, 3, 4, 5 这样的有序数字,会致使树的右侧持续延伸,左侧为空,形成类似于链表的结构,极大地降低了查找、插入和删除的效率。
-
极端的数据分布:当数据的分布极度不均衡时,也容易引发性能退化。比如,大量较小的值集中在左子树,而较大的值数量稀少且集中在右子树,或者情况相反。
举例
如下图所示的情形,将有序的序列插入 BST 中,会导致 BST 退化为一个单链表,致使查找、插入和删除的效率降低。
为避免性能退化,就需要对 BST 进行“旋转”,这便形成了 AVL 平衡二叉树,即“高度平衡的二叉搜索树”。
应用场景
-
数据库索引:
在数据库系统中,二叉搜索树能够用于构建索引结构,加快数据的检索速度。例如,B 树和 B+树等数据结构便是基于二叉搜索树的原理扩展而来,广泛应用于数据库的索引实现当中。
-
搜索算法:
众多搜索算法均可利用二叉搜索树来优化搜索过程。例如,在图的搜索算法里,可以使用二叉搜索树来存储已经访问过的节点或者待访问的节点列表。