![](https://img-blog.csdnimg.cn/20190111160634431.jpeg?x-oss-process=image/resize,m_fixed,h_224,w_224)
玩转数据结构和算法
文章平均质量分 57
主要介绍数据结构和算法,数据结构从基础讲起,把原理讲透;算法着重讲解排序算法,主要是为求职者准备的,突破算法面试。
姜皓
胸藏文墨怀若谷 腹有诗书气自华
展开
-
Java 源码剖析(29)--红黑树和平衡二叉树有什么区别?
红黑树和平衡二叉树有什么区别?1)红黑树和二叉树的定义2)红黑树的优势3)自平衡的红黑树数据结构属于理解一些源码和技术所必备的知识,比如要读懂 Java 语言中 TreeMap 和 TreeSet 的源码就要懂红黑树的数据结构,不然是无法理解源码中关于红黑树数据的操作代码的,比如左旋、右旋、添加和删除操作等。红黑树和二叉树有什么区别?1)红黑树和二叉树的定义二叉树(Binary Tree)是指每个节点最多只有两个分支的树结构,即不存在分支大于 2 的节点,二叉树的数据结构如下图所示:这是一棵拥有原创 2020-11-23 10:24:55 · 450 阅读 · 0 评论 -
算法(02)--回溯算法详解
@[TOC](回溯算法详解)解决⼀个回溯问题,实际上就是⼀个决策树的遍历过程。你只需要思考 3个问题:1、路径:也就是已经做出的选择。2、选择列表:也就是你当前可以做的选择。3、结束条件:也就是到达决策树底层,⽆法再做选择的条件。如果你不理解这三个词语的解释,没关系,我们后⾯会⽤「全排列」和「N 皇后问题」这两个经典的回溯算法问题来帮你理解这些词语是什么意思。代码⽅⾯,回溯算法的框架:result = []def backtrack(路...原创 2020-11-17 10:51:35 · 344 阅读 · 0 评论 -
重学数据结构与算法(09)--树和二叉树:分支关系与层次结构下如何有效实现增删查?
树和二叉树:分支关系与层次结构下如何有效实现增删查?1)树是什么2)二叉树是什么3)树的基本操作3.1)二叉查找树的特性3.2)二叉查找树的查找操作3.3)二叉查找树的插入操作4)树的案例5)总结1)树是什么树是由结点和边组成的,不存在环的一种数据结构。通过下图,我们就可以更直观的认识树的结构:树满足递归定义的特性。也就是说,如果一个数据结构是树结构,那么剔除掉根结点后,得到的若干个子结构也是树,通常称作子树。在一棵树中,根据结点之间层次关系的不同,对结点的称呼也有所不同。我们来看下面这棵树,如下图原创 2020-06-26 15:23:03 · 240 阅读 · 0 评论 -
重学数据结构与算法(08)--字符串:搞定字符串匹配算法
字符串:搞定字符串匹配算法1)字符串是什么2)字符串的基本操作2.1)字符串的新增操作2.2)字符串的删除操作2.3)字符串的查找操作子串查找(字符串匹配)查找出两个字符串的最大公共字串3)总结1)字符串是什么字符串(string) 是由 n 个字符组成的一个有序整体( n >= 0 )。例如,s = “BEIJING” ,s 代表这个串的串名,BEIJING 是串的值。这里的双引号不是串的值,作用只是为了将串和其他结构区分开。字符串的逻辑结构和线性表很相似,不同之处在于字符串针对的是字符集,也就原创 2020-06-25 16:35:42 · 424 阅读 · 0 评论 -
重学数据结构与算法(07)--数组:如何实现基于索引的查找?
数组:如何实现基于索引的查找?1)数组是什么2)数组的基本操作2.1)数组的新增操作2.2)数组的删除操作2.3)数组的查找操作2.4)数组增删查操作的特点3)数组的案例4)总结由于栈和队列是特殊的线性表,本质上他们都可以被看作是一类基本结构。而数组则可以看成是线性表的一种推广,它属于另外一种基本的数据结构。这一课时,我们就来学习数组的概念以及如何用数组实现增删查的操作。1)数组是什么数组是数据结构中的最基本结构,几乎所有的程序设计语言都把数组类型设定为固定的基础变量类型。我们可以把数组理解为一种容器原创 2020-06-20 17:23:57 · 444 阅读 · 0 评论 -
重学数据结构与算法(04)--如何完成线性表结构下的增删查
如何完成线性表结构下的增删查?1)什么是数据结构?2)什么是线性表3)线性表对于数据的增删查处理4)线性表案例5)总结数据在代码中被处理和加工的最小单位动作是增、删、查。它们是深入学习数据结构的根基,通过“增删查”的操作,我们可以选择更合适的数据结构来解决实际工作中遇到的问题。例如,几个客户端分别向服务端发送请求,服务端要采用先到先得的处理方式,应该如何设计数据结构呢?从本课时开始,我们将正式开始系统性的学习数据结构的内容。1)什么是数据结构?数据结构,从名字上来看是数据的结构,也就是数据的组织方式原创 2020-06-02 20:40:03 · 230 阅读 · 0 评论 -
重学数据结构与算法(03)--增删查:掌握数据处理的基本操作
掌握数据处理的基本操作1)代码对数据的处理2)数据处理的基本操作3)数据操作与数据结构的案例4)总结要想灵活使用数据结构,需要先弄清楚数据在代码中被处理、加工的最小单位动作,也就是数据结构的基本操作,有了这些动作之后,就可以基于此去选择更合适的数据结构了,下面介绍数据处理的基本操作。1)代码对数据的处理在一个数组中找出出现次数最多的那个元素的数值。例如,输入数组 a = [1,2,3,4,5,5,6] 中,只有 5 出现了两次,其余都是 1 次,显然 5 出现的次数最多,则输出 5。为了降低时间复杂度原创 2020-05-26 12:24:28 · 501 阅读 · 0 评论 -
重学数据结构与算法(02)--将时间复杂度转换成空间复杂度
将时间复杂度转换成空间复杂度1)时间昂贵、空间廉价2)数据结构连接时空3)降低复杂度的案例例一例二4)总结面试的过程中,常常会遇到考察手写代码的场景,通常面试官会追问:“这段代码的时间复杂度或者空间复杂度,是否还有降低的可能性?”如果没有经过专门的学习或训练,应聘者只能在各种漫无目的的尝试中去寻找答案。别忘了,代码效率优化就是要将可行解提高到更优解,最终目标是:要采用尽可能低的时间复杂度和空间复杂度,去完成一段代码的开发。你可能会困惑,优化代码需要积累非常多的实际经验,初学者通常很难找到最优的编码解决原创 2020-05-22 11:05:23 · 930 阅读 · 5 评论 -
重学数据结构与算法(01)--复杂度:如何衡量程序运行的效率?
复杂度:如何衡量程序运行的效率?1)复杂度是什么2)计算复杂度3)时间复杂度与代码结构的关系4)降低时间复杂度的必要性5)总结当你在大数据环境中开发代码时,你一定遇到过程序执行好几个小时、甚至好几天的情况,或者是执行过程中电脑几乎死机的情况:如果这个效率低下的系统是离线的,那么它会让我们的开发周期、测试周期变得很长。如果这个效率低下的系统是在线的,那么它随时具有时间爆炸或者内存爆炸的可能性。因此,衡量代码的运行效率对于一个工程师而言,是一项非常重要的基本功。本课时我们就来学习程序运行效率相关的度原创 2020-05-22 10:18:33 · 848 阅读 · 0 评论 -
图解排序算法(06) -- 桶排序
桶排序1、初识桶排序2、桶排序代码实现时间复杂度分析3、排序总结1、初识桶排序每一个桶(bucket)代表一个区间范围,里面可以承载一个或多个元素,假设有一个非整数数列如下:4.5,0.84,3.25,2.18,0.5桶排序的工作原理:第1步,创建桶,并确定每一个桶的区间范围具体需要建立多少个桶,如何确定桶的区间范围,有很多种不同的方式。这里创建桶数量等于原始数列的元素数量,除最...原创 2020-04-02 20:49:36 · 387 阅读 · 0 评论 -
图解排序算法(05) -- 计数排序
计数排序1、初识计数排序2、计数排序的代码实现3、计数排序优化4、计数排序优化代码实现5、计数排序局限性1、初识计数排序【假设数组中有20个随机整数,取值范围为0~10,要求用最快的速度把这20个整数从小到大进行排序】考虑到这些整数只能够在0、1、2、3、4、5、6、7、8、9、10这11个数中取值,取值范围有限。所以可以根据这有限的范围,建立一个长度为11的数组,数组下标从0到10,元素初...原创 2020-03-30 20:35:31 · 456 阅读 · 0 评论 -
图解排序算法(04) -- 堆排序
堆排序1、初识堆排序2、堆排序代码实现3、堆排序总结1、初识堆排序二叉堆的特性:最大堆的堆顶是整个堆中的最大元素最小堆的堆顶是整个堆中的最小元素以最大堆为例,如果删除一个最大堆的堆顶(并不是完全删除,而是跟末尾的点交换位置),经过自我调整,第2大的元素就会被交换上来,成为最大堆的新堆顶,如下图:如上图所示,在删除值为10的堆顶节点后,经过调整,值为9的新节点就会顶替上来;在删除值...原创 2020-03-30 00:05:27 · 187 阅读 · 0 评论 -
图解排序算法(03) -- 彻底搞懂快速排序
快速排序1、初识快速排序使用分治法的优势2、基准元素的选择3、元素的交换双边循环法(递归)双边循环法代码实现单边循环法(递归)单边循环法代码实现1、初识快速排序同冒泡排序一样,快速排序也属于交换排序,通过元素之间的比较和交换位置来达到排序的目的。不同的是:冒泡排序在每一轮中只把1个元素冒泡到数列的一端快速排序则在每一轮挑选一个基准元素,并让其他比它大的元素移动到数列一边,比它小的元素移...原创 2020-03-28 16:02:41 · 505 阅读 · 1 评论 -
图解排序算法(02) -- 鸡尾酒排序
鸡尾酒排序1、简述鸡尾酒排序2、鸡尾酒排序代码实现3、鸡尾酒排序优缺点1、简述鸡尾酒排序在上一篇博文《你不知道的冒泡排序》中介绍了冒泡排序,而【鸡尾酒排序】可以看做是【升级版的冒泡排序】,相比较而言鸡尾酒排序的元素比较和交换过程是双向的!例:8个数字组成一个无序数列{2,3,4,5,6,7,8,1},对其进行从小到大的排序冒泡排序过程如下:上述过程的弊端:元素2、3、4、5、6、7、...原创 2020-03-26 20:14:53 · 310 阅读 · 0 评论 -
图解排序算法(01) -- 你不知道的冒泡排序
冒泡排序1、初识冒泡排序2、冒泡排序的代码实现3、冒泡排序的初步优化4、冒泡排序的进阶优化1、初识冒泡排序冒泡排序的英文是bubble sort,它是一种基础的交换排序;冒泡排序每一个元素都可以根据自身大小,一点一点地向着数组的一侧移动。例:有8个数字组成一个无序数列{5,8,6,3,9,2,1,7},希望按照从小到大的顺序对其进行排序按照冒泡排序的思想,要把相邻的元素两两比较,当...原创 2020-03-25 09:49:40 · 255 阅读 · 0 评论 -
图解数据结构(09) -- 优先队列
优先队列1、优先队列的特点2、优先队列的实现3、优先队列的代码实现1、优先队列的特点队列 的特点是 先进先出, 入队列,将新元素置于队尾:出队列,队头元素最先被移出:优先队列不再遵循先入先出的原则,而是分为两种情况:最大优先队列,无论入队顺序如何,都是当前最大的元素优先出队最小优先队列,无论入队顺序如何,都是当前最小的元素优先出队例:有一个最大优先队列,其中的最大元素是8,...原创 2020-03-24 08:56:59 · 1052 阅读 · 0 评论 -
图解数据结构(08) -- 二叉堆
二叉堆1、初识二叉堆2、二叉堆的自我调整【1】插入节点【2】删除节点【3】构建二叉堆3、二叉堆的代码实现1、初识二叉堆二叉堆本质上是一种完全二叉树,它分为两个类型:最大堆最大堆的任何一个父节点的值,都大于或等于它左、右孩子节点的值,如下图所示:最小堆最小堆的任何一个父节点的值,都小于或等于它左、右孩子节点的值,如下图所示:堆顶二叉堆的根节点叫作堆顶;最大堆和最小堆的特点决定了...原创 2020-03-16 21:03:04 · 294 阅读 · 1 评论 -
图解数据结构(07) -- 广度优先遍历
广度优先遍历如果说深度优先遍历是在一个方向上“一头扎到底”,那么广度优先遍历则恰恰相反:先在各个方向上各走出1步,再在各个方向上走出第2步、第3步……一直到各个方向全部走完。下面让我们通过二叉树的层序遍历,来看一 看广度优先是怎么回事:【层序遍历,就是二叉树按照从根节点到叶子节点的层次关系,一层一层横向遍历各个节点】上图就是一个二叉树的层序遍历,每个节点左侧的序号代表该节点的输出顺序;但...原创 2020-03-16 20:12:54 · 2931 阅读 · 0 评论 -
图解数据结构(06) -- 二叉树的遍历
二叉树的遍历1、二叉树的遍历二叉树遍历分类2、深度优先遍历【1】前序遍历【2】中序遍历【3】后序遍历1、二叉树的遍历在计算机程序中,遍历本身是一个线性操作,所以遍历同样具有线性结构的数组或链表是一件轻而易举的事情,如下图:二叉树则是典型的非线性数据结构,遍历时需要把非线性关联的节点转化成一个线性的序列,以不同的方式来遍历,遍历出的序列顺序也不同:二叉树遍历分类从节点之间位置关系的角度...原创 2020-01-14 21:07:43 · 429 阅读 · 0 评论 -
图解数据结构(05) -- 二叉树
二叉树1、什么是树2、什么是二叉树满二叉树完全二叉树二叉树的物理存储结构链式存储结构数组存储结构3、二叉树的应用【1】查找【2】 维持相对顺序1、什么是树在数据结构中,树的定义如下:树(tree)是 n(n≥0)个节点的有限集,当n=0时,称为空树,在任意一个非 空树中,有如下特点:有且仅有一个特定的称为根的节点;当n>1时,其余节点可分为m(m>0)个互不相交的有限集,每...原创 2020-01-02 19:55:18 · 1106 阅读 · 0 评论 -
图解数据结构(04) -- 哈希表
哈希表1、什么是哈希表2、哈希函数哈希函数的实现3、哈希表的读写操作写操作(put)读操作(get)扩容(resize)4、总结1、什么是哈希表哈希表(hash table),这种数据结构提供了键(Key)和值 (Value)的映射关系;只要给出一个Key,就可以高效查找到它所匹配的Value,时间复杂度接近于O(1)2、哈希函数散列表在本质上也是一个数组,可是数组只能根据下标,像a[0...原创 2019-12-30 20:18:33 · 2462 阅读 · 1 评论 -
图解数据结构(04) --队列
队列1、什么是队列2、队列的基本操作【1】入队【2】出队循环队列循环队列代码实现3、队列的应用双端队列优先队列1、什么是队列假如公路上有一条单行隧道,所有通过隧道的车辆只允许从隧道入口驶入,从隧道出口驶出,不允许逆行,如下图:因此,要想让车辆驶出隧道,只能按照它们驶入隧道的顺序,先驶入的车辆先驶出,后驶入的车辆后驶出,任何车辆都无法跳过它前面的车辆提前驶出:队列(queue)是一种线性...原创 2019-12-30 00:15:37 · 3044 阅读 · 0 评论 -
图解数据结构(03) -- 栈
栈1、什么是栈2、栈的基本操作【1】入栈【2】出栈3、栈的应用1、什么是栈假如有一个又细又长的圆筒,圆筒一端封闭,另一端开口;往圆筒里放入乒乓球,先放入的靠近圆筒底部,后放入的靠近圆筒入口,如下图:如果要想取出这些乒乓球,则只能按照和放入顺序相反的顺序来取,先取出后放入的,再取出先放入的,而不可能把最里面最先放入的乒乓球优先取出栈(stack)是一种线性数据结构,它就像一个上图所示的放...原创 2019-12-29 23:37:37 · 434 阅读 · 0 评论 -
图解数据结构(02) -- 链表
链表1、什么是链表单向链表双向链表链表的存储方式2、链表的基本操作【1】查找节点【2】更新节点【3】插入节点【4】删除元素3、数组VS链表1、什么是链表单向链表链表(linkedlist)是一种在物理上非连续、非顺序的数据结构,由若干节点(node)所组成;单向链表的每一个节点又包含两部分,一部分是存放数据的变量 data,另一部分是指向下一个节点的指针 next结构图:代码实现: ...原创 2019-12-28 16:02:57 · 504 阅读 · 0 评论 -
图解数据结构(01) -- 数组
数组1、什么是数组数组对应的英文是 array,是有限个相同类型的变量所组成的有序集合,数组中 的每一个变量被称为元素。数组是最为简单、最为常用的数据结构;以整型数组为例,数组的存储形式如下图所示:数组中的每一个元素有着自己的下标,只不过这个下标从0开始,一直到数组长度-1;数组的另一个特点,是在内存中顺序存储,因此可以很好地实现逻辑上的顺序表。数组在内存中的顺序存储:内存是由一个个连续...原创 2019-12-26 20:41:37 · 1541 阅读 · 0 评论 -
突破算法面试(01)——什么是优秀的算法面试
什么是优秀的算法面试一、简述算法面试对一组数据进行排序考虑要点:·有没有可能包含有大量重复的元素?·是否大部分数据距离它正确的位置很近?是否近乎有序?·是否数据的取值范围非常有限?比如对学生成绩排序。·是否需要稳定排序?·是否是使用链表存储的?·数据的大小是否可以装载在内存里?什么是“正确"的回答一个算法问题:正确还包含对问题的独到见解;优化;代码规范;容错性;如果是...原创 2019-01-11 17:44:02 · 353 阅读 · 0 评论 -
Java 八大排序算法总结
概述排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。我们这里说说八大排序就是内部排序。插入排序思想:每步将一个待排序的记录,按其顺序码大小插入到前面已经排序的子序列的合适位置,直到全部插入排序完为止。关键问题:在前面已经排好序的序列中找到合适的插入位置。方法:直接插入排序 二分插...转载 2018-09-17 09:08:04 · 215 阅读 · 0 评论 -
玩转数据结构(21)-- 哈希表
哈希表一、哈希表基础从习题入手【题目链接】思路:可以不使用树结构来实现映射,可以直接设置包含 26个 元素的数组,对数组中每一位表示某一个字符对应的频率即可;索引为 0 的位置表示 a ,索引为 1 的位置表示 b ,以此类推。哈希表定义:把所关心的键通过哈希函数转换为索引,然后直接把内容存在数组中即可代码:class Solution { public in...原创 2019-07-25 17:16:27 · 450 阅读 · 0 评论 -
玩转数据结构(20)-- 红黑树
红黑树史上最清晰的红黑树讲解(上)史上最清晰的红黑树讲解(下)一、概述图示:红黑树是二分搜索树,并在二分搜索树的基础上添加一些性质确保其不会退化为链表,保证其是平衡二叉树《算法导论》中的具体规定:1.每个节点要么是红色,要么是黑色;2.根节点是黑色的3.每个叶子节点(最后的空节点)是黑色的4.如果一个节点是红色的,则其两个孩子节点都是黑色的5.从任意...原创 2019-07-25 17:16:52 · 574 阅读 · 0 评论 -
玩转数据结构(19)-- AVL
AVL在二分搜索树中,如果是顺序添加进搜索树的话,则会排成一列,成为链表,从而极大的降低二分搜索树的执行效率; 解决这个问题:在二分搜索树的基础上添加一定的机制,使得二分搜索树能够维持平衡二叉树的性质;AVL : 最经典的平衡二叉树;(发明人:Adelson-Velsky 和 E.M.Landis 名字缩写为 AVL),最早的自平衡二分搜索树结构;平衡二叉树:【详解...原创 2019-07-25 17:17:01 · 386 阅读 · 0 评论 -
玩转数据结构(18)-- 并查集
并查集(Union Find)一、概述一个很有意思的并查集详解由孩子节点指向父亲节点的树结构,解决连接问题,如图来判断两个点之间是否是连接的并查集:可以快速判断网络中节点间的连接状态【网络:抽象概念,用户之间形成的网络】可以高效回答连接问题的数据结构对于一组数据,主要支持两个动作:1.uoion(p,q) --并,传入数据 p 和 q,在并查集内部将这两个数据,以及...原创 2019-07-25 17:17:21 · 303 阅读 · 0 评论 -
玩转数据结构(17)-- 字典树
字典树(Tire)[前缀树]一、概述【多叉树】 专门处理字符串,专门为 字典(一个词条和一个示意相对应)设计的数据结构;在 字典 中,有 n 个词条,使用 映射 方式查找,本质是使用 树结构 ,查询的时间复杂度是 O(log n);使用 字典树(Tire) 的数据结构时,查询每个词条的时间复杂度与 字典 中一共有多少条目无关;与查询字符串[单词]的长度 w 相关,时间复杂度为...原创 2019-07-25 17:17:33 · 583 阅读 · 0 评论 -
玩转数据结构(16)-- 线段树
线段树【区间树】(Segment Tree)一、为何使用线段树对于有一类问题,我们关心的是线段(或区间)经典线段树问题:区间染色有一面墙,长度为 n ,每次选择一段墙进行染色染色过程:1. 4-9 黄色2. 7-15 绿色3. 1-5 蓝色4. 6-12 红色存在颜色覆盖问题,1.m 次操作后,可以看见多少种颜...原创 2019-07-25 17:17:42 · 241 阅读 · 0 评论 -
玩转数据结构(15)-- 基于堆的优先队列
基于堆的优先队列一、代码实现Queue.javapublic interface Queue<E> { int getSize(); boolean isEmpty(); void enqueue(E e); E dequeue(); E getFront();}PriorityQueue.javapublic cl...原创 2019-07-25 17:17:51 · 202 阅读 · 0 评论 -
玩转数据结构(14)-- 堆中的Heapify 和 Replace
Heapify 和 Replace一、replace定义:取出最大元素后,放入一个新元素【堆中总数没有变化】实现方法:1.可以先 extractMax,再 add,两次O(log n)的操作; 2.可以直接将堆顶元素替换以后 Sift Down,一次 O(log n)的操作;代码实现:MaxHeap.javapublic class Ma...原创 2019-07-25 17:17:59 · 943 阅读 · 2 评论 -
玩转数据结构(13)-- 优先队列和堆的添加/取出操作
优先队列和堆一、优先队列普通队列:先进先出,后进后出优先队列:出队顺序和入队顺序无关;和优先级相关;(例如医院排队和操作系统动态选择优先级最高的任务执行)图解:关键词“动态”;队列中的元素是在不断变化的,不断有新元素入队,不仅仅是按照优先级排序;【优先级可以具体定义】与普通队列的区别:出队元素是优先级最高的元素;队首元素也是优先级最高的元素,而不是最早进入队列的元素;...原创 2019-07-25 17:18:10 · 502 阅读 · 0 评论 -
玩转数据结构(12)--映射基础与映射实现
映射基础与映射实现一、映射(Map)基础定义:定义域中的每一个值在止于中都有一个值与它对应;存储(键、值)【Key、Value】数据对的数据结构;根据键,来快速的寻找值,可以非常容易的使用二分搜索树来实现它实现机制:Map<K,V> 通过泛型来实现,向 Map 中传入 Key 和 Value 这两个环境变量;void add(K,V) 添加...原创 2019-07-25 17:18:22 · 536 阅读 · 0 评论 -
玩转数据结构(12)--集合基础与集合实现
集合(set)基础与集合实现一、 集合基础和基于二分搜索树的集合实现集合:承载元素的容器,但每个元素都只能存在一次;能够快速实现“去重”这个工作;(二分搜索树不能添加重复元素,是非常好的实现“集合”的底层数据结构)基础功能代码:Set<E>void add(E) :向集合中添加元素E(不能添加重复元素)void remove(E) :从集合中删除元...原创 2019-07-25 17:18:30 · 997 阅读 · 0 评论 -
玩转数据结构(11)--删除二分搜索树的节点
删除二分搜索树的节点一、删除二分搜索树的最小值和最大值1.先找到二分搜索树的最小值和最大值最小值:二叉树中的最左侧的元素(不存在左孩子的节点)最大值:二叉树中的最右侧的元素(不存在右孩子的节点)2.再删除二分搜索树的最小值和最大值 1.当要删除的节点为叶子节点时,直接删除即可2.当要删除的节点不是叶子节点时,将该节点删除,删除后将其整个右子树变为根节点的左...原创 2019-07-25 17:18:47 · 359 阅读 · 0 评论 -
玩转数据结构(10)--二分搜索树的层序遍历
二分搜索树的层序遍历前序、中序、后序遍历本质都是深度优先遍历层序遍历:根节点设置为第0层;先遍历第0层28、再遍历第1层16、30;再遍历第2层13、22、29、42;逐层向下遍历的节点在广度上进行拓展;这种遍历方式也称为广度优先遍历;通常使用非递归的方式实现图解:用队列的方式实现层序遍历1.每一次一个元素入队,从队尾的位置进入队列,初始化时将根节点入队2.以后每一次...原创 2019-07-25 17:18:54 · 553 阅读 · 0 评论