详解二叉查找树(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!