详解二叉查找树(BST)

详解二叉查找树(BST)

本篇随笔简单讲解一下数据结构——二叉查找树(\(Binary\,\,Sort\,\,Tree,BST\)),(后文的“二叉查找树”一词均用\(BST\)代替)。

BST的概念

首先,\(BST\)是一棵二叉树。

它的定义是,根节点左子树全部严格小于根节点,右子树大于等于根节点,并且,左右子树都是\(BST\)

很好理解,很明朗很简单的定义。

可以看出,这是一个通过递归方式定义的数据结构,所以,它的诸多操作自然要用到递归。

BST的功能

我们可以看出来,这个二叉查找树就是把一个有序数列按照一个树的方式排布了起来,说白了,就是一个以树的方式存在的有序数列。把这个序列变成树,方便我们在这个序列上进行对某一个值的查找,插入和删除。

我在学习\(BST\)的时候冒出了很多大胆的想法,在这里也一并说一声,让读者见笑了。

比如,我在想,如果对某一个值进行查找的话,二分的复杂度貌似也是log的样子?

\(BST\)比它强,因为它还支持插入和删除,复杂度都是\(log\)级别的。

我又在想,那进行查找和删除,貌似链表也可以?

\(BST\)比它强,因为它的复杂度都是\(log\)级别的,而链表是\(O(n)\)的。

总之,记住\(BST\)的形态和功能,一个字,有用就完了(不是......

BST的操作

建树

我们先来想一下,BST的建树过程:

对于一组数据来讲,我们要建BST的话,就直接按照定义递归建,与根节点判大小,大了往右走,小了往左走,直到一个空位置,就是它的位置了,插进去就可以。

但是这样的话会有几个问题。

首先,如果碰到一组单调的数据,BST瞬间变成链。

这个时候我们要么用平衡树对BST进行旋转来维护BST的平衡,要么用随机化算法把数据打乱。

如果有对打乱数据还懵圈的小可爱可以走这边:

数组的随机打乱

其次,因为这个树的形态未知,所以我们开多大空间也是未知的。

所以需要我们进行动态开点

管于动态开点的讲解与分析,会在以后在博客上新,还不会的同志自学一下哦!

增加元素

增加元素的操作比较好想,就是从上面递归一层层找,找到对应位置插进去就可以。

删除元素

删除元素的操作也比较好想,就是从上面一层层找,找到这个元素就删了就可以。(emm...又要被喷水博了)

写在后面

BST其实是平衡树的前置知识,(本蒟蒻就是因为要学平衡树才来学的BST),因为平衡树的原理就是针对我们刚刚所说的BST的缺点:形态、空间不确定,进行优化。用旋转的方法使得BST一直是一棵平衡树,这样的话就会对我们树上的相关操作方便很多。

最后祝大家AK IOI!

posted @ 2020-04-03 18:49  Seaway-Fu  阅读(1066)  评论(1编辑  收藏  举报