【数据结构】搜索二叉树是啥树?有啥用?
搜索二叉树是啥树?有啥用?
如果你写过数据结构,应该对“二叉树”不陌生。它长得像一棵树,每个节点最多有两个孩子。
但“搜索二叉树”(Binary Search Tree,简称 BST)你不一定知道,它在结构上增加了一条关键规则——排序性。
1. 搜索二叉树是啥?
一棵二叉树要被称为搜索二叉树,需要满足以下条件:
- 左子树所有节点的值 < 根节点的值
- 右子树所有节点的值 > 根节点的值
- 左右子树本身也必须是搜索二叉树
这样来看aaaaaaaaaaaaaaaaaaa,BST 就把“二叉树”和“有序数组”的特性结合了起来。
直观点看,它是一种“有序的二叉树”,只是数据分布在树的结构中。
举个例子:
8/ \3 10/ \ \1 6 14/ \ /4 7 13
这棵树就是一棵典型的搜索二叉树。
2. 搜索二叉树能干啥?
它的核心价值在于高效查找。
-
查找一个数:
从根节点开始,比较目标值与当前节点:- 如果相等,找到;
- 如果小于,去左子树;
- 如果大于,去右子树。
这样,每次比较都能“砍掉一半”,复杂度 O(log n) (理想情况下)。
-
插入一个数:
跟查找一样一路比下去,直到找到合适的空位置,把新节点挂上去。 -
删除一个数:
稍复杂点:- 如果是叶子节点,直接删;
- 如果有一个孩子,拿孩子顶替;
- 如果有两个孩子,用右子树的最小值或左子树的最大值替换,然后删那个节点。
除此之外,BST 还可以:
中序遍历结果是有序的序列。
这意味着,它可以被用来实现排序。
3. 搜索二叉树的问题
BST 看上去很nb,但也有缺陷。
如果插入的数据是有序的,就会退化成一条链表,比如:
1\2\3\4
这时候查找效率会降到 O(n) ,完全失去了“二分查找”的优势。
搜索二叉树的目的一般就是为了排除无序,如果变成有序的,那就没必要使用它了。
4. 怎么解决 BST 的缺陷?
为了解决退化问题,后来出现了平衡二叉树系列,比如:
- AVL 树:严格保持左右子树高度差不超过 1。
- 红黑树:宽松一些的平衡条件,换来更快的插入删除。
- B 树 / B+ 树:用于数据库和文件系统,支持磁盘存储上的高效查找。
所以实际上,现代编程语言的很多库容器,比如:
- C++ STL 里的
map
、set
(通常用红黑树实现) - Java 的
TreeMap
、TreeSet
背后几乎都不是 BST,而是这些改进版的平衡树。(也不是说被淘汰啦)
5. 小结~
搜索二叉树是一种带排序规则的二叉树,能实现高效查找、插入、删除,并且中序遍历自带排序功能。
它是许多复杂数据结构的“雏形”。