一文彻底掌握二叉查找树
在数据结构中,二叉查找树无疑是极为重要的,但是初学者理解起来却有些吃力,网上的文章讲得也不太全面。本文希望结合多组动图、图片以及详细的代码实现,力争让大家完全掌握二叉查找树(BST)的各种概念和操作。
先看一下本文的目录吧!每个操作都配有动图和详细实现代码(Java)
首先,如果你对树和二叉树的定义不是很了解的话,建议先去看一下这个系列的第一篇文章一文入门二叉树,力求对树有一个基本的认识,再来学习!
背景和必要性背景现代计算机和网络使我们能够接触和访问海量的信息,所以高效的检索这些信息将是一个巨大的挑战。这包括信息的存储、处理和查找。这一问题促使我们去研究经典查找算法,即如何高效的存储和查找数据?
目标实现一个符号表,我们将信息(键-值)储存在符号表里,根据相应的键去查找它所对应的值。你可以把它想象成一个字典,我们在字典中存储了大量的词语的释义,我们应该能够根据词语(索引)去查找这个词语对应的意思。
如下图所示,就是一个很简单的符号表,我们可以很轻松的通过键来查找值,但是,基于数组或者链表的这种数据结构并不高效,而且不能较好的维持一定的性质(比如我用数组存储了很多数据,你让我 ...
一文入门二叉树
在数据结构中,二叉查找树无疑是极为重要的,但是初学者理解起来却有些吃力,网上的文章讲得也不太全面。本文希望结合多组动图、图片以及详细的代码实现,力争让大家完全掌握二叉查找树(BST)的各种概念和操作。
什么是树(Tree)?我们首先来看一些图片:
其中,第一、二、四个都是树,第三个不是。树的特点很明显吧!
其中每个元素叫做“节点”;用来连接相邻节点之间的关系,我们称之为“父子关系”。例如在图一中,A节点是B节点的父节点,B节点是A节点的子结点,同时,B节点和Q节点是同一个父节点A的子节点,所以它们之间互相成为兄弟节点。我们把没有父节点的节点称为根节点,也就是图一中的A节点。我们把没有子节点的节点称为叶子节点,比如图一中的D、E、F、G节点。这些概念都是显而易见,但却是最基本的东西。
二叉树二叉树,自然就是每个节点最多有两个分支,即两个子节点的一种树,两个分支分别称为左子树和右子树。还是那上面那张图举例,图一、图二和图四都是二叉树,因为它们每个节点都最多含有两个子节点。其中,图一又称为满二叉树,图四又称为完全二叉树。而之所以出现完全二叉树的概念,其实是基于二叉树的物理存储方式。
二 ...
线性表(数组、链表、队列、栈)详细总结
线性表是一种十分基础且重要的数据结构,它主要包括以下内容:
数组
链表
队列
栈
接下来,我将对这四种数据结构做一个详细的总结,其中对链表实现了十几种常见的操作。希望对你有所帮助。
1.数组数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。注意点:①.数组是一种线性表;②.连续的内存空间和相同类型的数据由于第二个性质,数组支持 “随机访问”,根据下表随机访问的时间复杂度为O(1);但与此同时却使得在数组中删除,插入数据需要大量的数据搬移工作。
低效的“插入”和“删除”插入操作假如数组的长度为n,我们需要将一个数据插入到数组的第k个位置,我们需要将第k~n位元素都顺序地往后挪动一位。最好情况时间复杂度为O(1),此时对应着在数组末尾插入元素;最坏情况时间复杂度为O(n),此时对应着在数组开头插入元素;平均情况时间复杂度为O(n),因为我们在每个位置插入元素的概率相同,故(1+2+3+……+n)/n=O(n);但是根据我们的需求,有一个特定的场景。如果数组的数据是有序的,那么我们在插入时就一定要那么做;但是如果数组中存 ...
十大经典排序算法Java版总结
我想大家学习算法之旅的开端就是各种排序算法吧,的确,排序算法广泛的应用性以及它的简洁基础等性质是初学者的不二之选,那今天我就带着你复习回顾以下各种经典的排序算法吧!
我们的约定:本文所有排序算法操作对象为整数数组,顺序为从小到大
1.冒泡排序冒泡排序,顾名思义,就是数据像一个个气泡似的不断地往上冒。大致思路是 : 我们对给定的一个数组,进行n轮冒泡操作,每次操作分别比较相邻两项,如果前一项大于后一项,就将它们交换位置,你可以想象一下这个情景,经过n次比较(如果有必要就进行交换),最终的结果肯定是最大的那一项被移动到数组的最右端;那我们重复这个过程,经过n次冒泡操作,就将全部的数据进行了排序,这就是冒泡排序的思路。
但是我们可以进行一些优化,比如我定义一个名为flag的变量监测一轮冒泡操作中交换元素的次数,如果某次冒泡操作中元素交换的次数为0,那也就意味着所有元素已经完成了排序,我们就可以终止排序结束程序了。
具体的代码如下:123456789101112131415//冒泡排序,a为数组,n为数组的长度public static void bobbleSort(int a ...