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

  • 相关阅读:
    leetcode 二进制求和 python
    leetcode 66.加一 python3
    django自定义simple_tag和filter
    deepin Gtk-WARNING **: 无法在模块路径中找到主题引擎:“adwaita”
    MySQL ERROR 1698 (28000): Access denied for user 'root'@'localhost'
    deepin 安装scrapy安装出错:fatal error: Python.h 的解决办法
    Bootstrap的$(...).modal is not a function错误
    linux 安装mysql5.6
    linux之主机名bogon问题详解
    linux开启代理转发功能
  • 原文地址:https://www.cnblogs.com/fusiwei/p/12628328.html
Copyright © 2020-2023  润新知