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

原文地址:https://www.cnblogs.com/fusiwei/p/12628328.html

时间: 2024-10-04 13:38:56

详解二叉查找树(BST)的相关文章

二叉查找树(binary search tree)详解

二叉查找树(Binary Search Tree),也称二叉排序树(binary sorted tree),是指一棵空树或者具有下列性质的二叉树: 若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值 任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值 任意节点的左.右子树也分别为二叉查找树 没有键值相等的节点(no duplicate nodes) 本文地址:http://www.cnblogs.com/archimedes/p/binary-search-tree

AVL树平衡旋转详解

AVL树平衡旋转详解 概述 AVL树又叫做平衡二叉树.前言部分我也有说到,AVL树的前提是二叉排序树(BST或叫做二叉查找树).由于在生成BST树的过程中可能会出现线型树结构,比如插入的顺序是:1, 2, 3, 4, 5, 6, 7..., n.在BST树中,比较理想的状况是每个子树的左子树和右子树的高度相等,此时搜索的时间复杂度是log(N).可是,一旦这棵树演化成了线型树的时候,这个理想的情况就不存在了,此时搜索的时间复杂度是O(N),在数据量很大的情况下,我们并不愿意看到这样的结果. 现在

二叉树的应用详解 - 数据结构

二叉树的应用详解 - 数据结构 概述: 平衡树——特点:所有结点左右子树深度差≤1 排序树——特点:所有结点“左小右大字典树——由字符串构成的二叉排序树判定树——特点:分支查找树(例如12个球如何只称3次便分出轻重)带权树——特点:路径带权值(例如长度) 最优树——是带权路径长度最短的树,又称 Huffman树,用途之一是通信中的压缩编码. 1. 二叉排序树(二叉查找树 Binary Search Tree): 1.1 二叉排序树: 或是一棵空树:或者是具有如下性质的非空二叉树: (1)若左子树

算法导论学习---红黑树详解之插入(C语言实现)

前面我们学习二叉搜索树的时候发现在一些情况下其高度不是很均匀,甚至有时候会退化成一条长链,所以我们引用一些"平衡"的二叉搜索树.红黑树就是一种"平衡"的二叉搜索树,它通过在每个结点附加颜色位和路径上的一些约束条件可以保证在最坏的情况下基本动态集合操作的时间复杂度为O(nlgn).下面会总结红黑树的性质,然后分析红黑树的插入操作,并给出一份完整代码. 先给出红黑树的结点定义: #define RED 1 #define BLACK 0 ///红黑树结点定义,与普通的二

深入Java基础(四)--哈希表(1)HashMap应用及源码详解

继续深入Java基础系列.今天是研究下哈希表,毕竟我们很多应用层的查找存储框架都是哈希作为它的根数据结构进行封装的嘛. 本系列: (1)深入Java基础(一)--基本数据类型及其包装类 (2)深入Java基础(二)--字符串家族 (3)深入Java基础(三)–集合(1)集合父类以及父接口源码及理解 (4)深入Java基础(三)–集合(2)ArrayList和其继承树源码解析以及其注意事项 文章结构:(1)哈希概述及HashMap应用:(2)HashMap源码分析:(3)再次总结关键点 一.哈希概

查找(二)简单清晰的B树、Trie树详解

查找(二) 散列表 散列表是普通数组概念的推广.由于对普通数组可以直接寻址,使得能在O(1)时间内访问数组中的任意位置.在散列表中,不是直接把关键字作为数组的下标,而是根据关键字计算出相应的下标. 使用散列的查找算法分为两步.第一步是用散列函数将被查找的键转化为数组的一个索引. 我们需要面对两个或多个键都会散列到相同的索引值的情况.因此,第二步就是一个处理碰撞冲突的过程,由两种经典解决碰撞的方法:拉链法和线性探测法. 散列表是算法在时间和空间上作出权衡的经典例子. 如果没有内存限制,我们可以直接

Java集合详解6:TreeMap和红黑树

Java集合详解6:TreeMap和红黑树 初识TreeMap 之前的文章讲解了两种Map,分别是HashMap与LinkedHashMap,它们保证了以O(1)的时间复杂度进行增.删.改.查,从存储角度考虑,这两种数据结构是非常优秀的.另外,LinkedHashMap还额外地保证了Map的遍历顺序可以与put顺序一致,解决了HashMap本身无序的问题. 尽管如此,HashMap与LinkedHashMap还是有自己的局限性----它们不具备统计性能,或者说它们的统计性能时间复杂度并不是很好才

Java集合详解6:这次,从头到尾带你解读Java中的红黑树

<Java集合详解系列>是我在完成夯实Java基础篇的系列博客后准备开始写的新系列. 这些文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下Star.fork哈 文章首发于我的个人博客: www.how2playlife.com 什么是红黑树 首先,什么是红黑树呢? 红黑树是一种"平衡的"二叉查找树,它是一种经典高效的算法,能够保证

Spring事务管理(详解+实例)

写这篇博客之前我首先读了<Spring in action>,之后在网上看了一些关于Spring事务管理的文章,感觉都没有讲全,这里就将书上的和网上关于事务的知识总结一下,参考的文章如下: Spring事务机制详解 Spring事务配置的五种方式 Spring中的事务管理实例详解 1 初步理解 理解事务之前,先讲一个你日常生活中最常干的事:取钱. 比如你去ATM机取1000块钱,大体有两个步骤:首先输入密码金额,银行卡扣掉1000元钱:然后ATM出1000元钱.这两个步骤必须是要么都执行要么都