zoukankan      html  css  js  c++  java
  • 详解二叉查找树(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!

  • 相关阅读:
    POJ 1300 Open Door
    POJ 2230 Watchcow
    codevs 1028 花店橱窗布置
    codevs 1021 玛丽卡
    codevs 1519 过路费
    codevs 3287 货车运输
    codevs 3305 水果姐逛水果街二
    codevs 1036 商务旅行
    codevs 4605 LCA
    POJ 1330 Nearest Common Ancestors
  • 原文地址:https://www.cnblogs.com/fusiwei/p/12628328.html
Copyright © 2011-2022 走看看