前言
大家好呀,小嘟我又写文章啦!(今天还蛮比较轻松,所以小嘟我就抓紧时间更新一篇),嘿嘿嘿,希望可以帮助读者哦!
小嘟在这说两句:读者如果想刷题的话,请一定要坚持下去,不能保证一天一题的话,两天一题也可以呀!(这是小嘟为自己的懒惰找的借口,嘿嘿嘿)。在小嘟本人看来,做题这个东西,你一直写还好,隔很长时间不写,然后又想写,就有点困难了(因为你已经养成不写的习惯了,一个事情一旦养成习惯就很难再改变)。
小嘟我对做题的一个看法:要学某一类数据结构,比如说数组、链表、二叉树,首先你得熟练掌握如何遍历这种数据结构,其次才能进阶,做中等,做复杂的难题。如果最基本的遍历都不会,那还做啥题,洗洗睡吧! (😂😂😂小嘟是开玩笑的,不会的话那就请继续加油吧!!!)
聊天结束,开始进入今天的正题👍👍👍
今天小嘟给大家带来的是另一种遍历方式,发现没,我们写的这几篇文章,都离不开一个词:遍历,所以说,我们一定要把遍历这个最基本的掌握好,小嘟和大家继续加油哦!
主题(Topic)
- 一种新的遍历方式,层次遍历,有时也称广度优先搜索,提到广度,我们不免就想到了深度优先搜索,但这个不是今天的重点,小嘟就稍微提一下。
- 广度优先搜索(层次遍历)
看到这个图是不是好熟悉啊,哈哈哈,其实从第一篇题目开始,小嘟一直都用的是这个图。
层次遍历的思路:我们把在同一个水平上的结点当做同层(这里我用箭头线当做层级的基准线),我们要遍历下一层级,那么首先必须把本层的元素都遍历完,才能进行下一层级的遍历,这就是层序遍历的简单介绍。
正文
- 今日题目(是个中等题哦,但是不要慌,嘿嘿嘿,本嘟在此,不惧)
这个题什么意思呢?答:你把这些结点当做葡萄(在同一个平面上的一串葡萄),我们给这些葡萄编上序号,然后站在图中箭头所在的一边,以箭头所指的方向看这些葡萄,能直接看到的葡萄结点就是我们要摘下来的。以示例为例,我们要摘下的葡萄序号为[1,3,4]。
题目分析:我们是站在右侧,然后要摘下我们能直接看到的结点,那么什么样的结点我们能直接看到?它有什么特点呢?想到这里,问题就解决了,小嘟替读者说了哦:那就是每层的最右边的结点被看到,每层?是不是就想到层次遍历了呢?,话不多说,看代码呗!
- 层次遍历的代码实现
var rightSideView = function(root) { let res = [];//要返回的数组 let thisFloor = [];//存放本层结点的数组 let nextFloor = [];//存放下一层结点的数组 if (root == null) return res;//如果树为空树,直接返回 thisFloor.push(root); while(thisFloor.length != 0){//本层还有结点 let node = thisFloor.shift();//从数组的首部取出一个结点, //并将该结点删除 if(node.left) nextFloor.push(node.left)//左结点有 if((node.right)) nextFloor.push(node.right)//右结点有 if(thisFloor.length == 0){//本层遍历完,开始重新赋值,更新 res.push(node.val); thisFloor = nextFloor; nextFloor = []; } } return res; };
代码的解释小嘟都详细的写在代码哪里啦,小嘟在这里简单提一下:每次循环遍历的都是本层的结点
,同时
把该结点的下一层孩子结点也保存起来,等到遍历到本层结点的最后一个元素,将该结点返回
,然后将下一层的结点又更新为本层结点,然后又接着
找下一层的结点,直到下一层对的元素个数为空,循环退出。
结尾
- 今天小嘟给大家留一个思考题,请看题:还是上边这个题的思想不变,这个时候我从
左往右看
,返回我直接能看到的元素集合,该怎么做呢?。 - 若有问题,欢迎留言!!!,小嘟会尽自己最大的努力解决问题。
- 希望读者看完能有所收获!
谢谢读者点赞点赞点赞啦!
小嘟溜啦溜啦...