二叉搜索树
二叉搜索树(Binary Search Tree,简称BST)是一种特殊的二叉树,它具有以下几个特点:
- 节点的左子树上的所有节点的值都小于或等于该节点的值。
- 节点的右子树上的所有节点的值都大于或等于该节点的值。
- 每个节点的左右子树也都是二叉搜索树。
这些特点使得二叉搜索树在进行搜索、插入和删除操作时非常高效。具体来说,在平均情况下,这些操作的时间复杂度都是 (O(\log n)),其中 (n) 是树中的节点数。
二叉搜索树的基本操作
-
搜索(Search):
-
从根节点开始,比较目标值与当前节点的值:
-
如果目标值等于当前节点的值,则搜索成功;
-
如果目标值小于当前节点的值,则在左子树中继续搜索;
-
如果目标值大于当前节点的值,则在右子树中继续搜索。
-
-
-
插入(Insert):
- 从根节点开始,找到目标值应该插入的位置,保持二叉搜索树的性质。
- 如果目标值小于当前节点的值,则插入到左子树中;
- 如果目标值大于当前节点的值,则插入到右子树中。
-
删除(Delete):
- 删除操作稍微复杂一些,分为三种情况:
- 要删除的节点是叶子节点(没有子节点),直接删除即可。
- 要删除的节点有一个子节点,用该子节点替代要删除的节点。
- 要删除的节点有两个子节点,需要找到该节点的中序后继(右子树中最小的节点)或中序前驱(左子树中最大的节点),用这个节点的值替换要删除的节点的值,然后删除这个节点。
- 删除操作稍微复杂一些,分为三种情况:
示例
假设我们有以下一组数据:[5, 3, 8, 2, 4, 7, 9],构建的二叉搜索树如下:
5
/ \
3 8
/ \ / \
2 4 7 9
- 搜索
4
:从根节点5
开始,4 < 5
,往左走;到达3
节点,4 > 3
,往右走;到达4
节点,找到目标值。 - 插入
6
:从根节点5
开始,6 > 5
,往右走;到达8
节点,6 < 8
,往左走;到达7
节点,6 < 7
,往左走,插入6
节点。 - 删除
3
:节点3
有两个子节点,找到4
(中序后继)替换3
,然后删除节点4
。
二叉搜索树因其高效的操作性能,在许多应用中被广泛使用,如数据库索引和内存中的数据结构。