关于二叉树的层序遍历方式
心态崩了
蓝桥杯的题好难……前面几道填空题,暴力固然可以做,可是代码量大,能保证代码写出来不出错也是很难的……而有一些题目,要进行剪枝等等操作,还有一些题目,思路都很难想……虽然看了别人的的答案之后——啊呀!不就是这么一回事么!
可是自己做起来就是很难搞。
后面的几道大题就更是很难很难了。
线段树、前后缀和、图论……不是我吹,吹牛可以,真写起来是一道也不会。能写个dfs就已经快到极限了,用个滚动数组、滑动窗口、二分查找优化一下就是真的极限了……
今年的蓝桥杯能给我来一道比较简单的动态规划,我就真的谢天谢地。
马上又要开学了。感觉一个寒假过去啥也没学到,啥也不是…………下个学期课还算是比较少……但是有大学物理…………先走一步看一步吧,慢慢学,慢慢努力……蓝桥杯这种玩意……今年拿不了奖还可以明年再试试,然后到大三就努力备战考研了。
下面是代码部分
先来说说 queue
queue和栈最大的区别是queue是先进先出的,叫做队列,栈是先进后出的,类似于一个十分窄的箱子,前面放进去的东西就只好最后才能取出来。
队列则是类似于平时的排队,先排队的人先出来。
1 | { |
知道了queue的性质,来讲讲二叉树的层序遍历。
所谓的层序遍历就是把二叉树的每一层的元素都遍历出来,默认是从左到右,顺序是每一层,从根节点逐层向下。
那么输出的状态就是[[],[]]这样的,因为有的节点是有两个值的。或者不用这样只是输出排序也成。
1 | //在蓝桥杯里,不像是leetcode那样一切都是封装好,只需要写一个函数即可,在蓝桥杯上,要写一个完整的函数。 |
有几点是特别妙的。
首先就是使用队列可以减少空间开支,这样除了那些用来维护的内存、树本身的内存外只需要两层树的内存即可。
每一层都是root->left然后再root->right,这样本身就可以维护队列的从左到右。由于根节点只有一个,所以根节点无所谓是从左到右还是从右到左,其他的节点都是先左再右,然后再加上队列的先进先出的特点,这下子就可以实现从左到右的排列。
说说一个朴素的做法,也就是leetcode题解中提到的那一个做法,也是类似的历遍,但是是使用哈希表,使用一个二元组记录下节点与其对应的层数,使用哈希表来储存这些数据。
然后输出的时候就可以使用层数作为key来输出每一层的元素了。
那么锯齿层序遍历是怎么搞呢?锯齿层序遍历就是每一层遍历的顺序是反过来的,这一层是从左到右,下一层就是从右到左。
可以在存数据进res的时候反转一下数据、或者是需要翻转的时候就把此节点的值添加到队列的尾部,同样是从左到右遍历,那么添加的时候就已经从右到左添加了。
-我的Bilibili墨泽moozy
-我的公众号墨泽moozy
-我的知乎干干净净我的心
-我的博客