还不知道层序遍历有多强?带你一口气打穿十道题(动图理解)(上)

简介: 众所周知二叉树的遍历一般是前中后序遍历,但其实还有一种层序遍历。它是按照一层一层的顺序去遍历二叉树

🍓1.什么是层序遍历?


        层序遍历顾名思义就是按照二叉树的层数从左到右一层一层遍历数组。这种遍历方式和之前的三种前中序遍历都不太一样,如果你还对于前中后序三种遍历不太熟练,推荐你看一下我的这篇博客——二叉树的前中后序遍历(递归与迭代)。前中后序的遍历主要的区别是在于根节点与左右子结点的遍历顺序,而层序遍历则没有这个关系。


       想完成层序遍历需要借用一个辅助数据结构队列来实现。为什么呢?因为队列的性质是先进先出,这非常符合我们的需求,因为层序遍历应用的正是图论中的广度优先搜索思想,只不过我们将该种思想应用与二叉树中。


image.png

https://ucc.alicdn.com/images/user-upload-01/3583e35d285f45359a789df7a607267c.gif


🍓2.化身叶问一打十


👊1.二叉树的层序遍历(图解加代码模板)

给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。


题目链接:二叉树的层序遍历https://leetcode-cn.com/problems/binary-tree-level-order-traversal/


      题目要求正是要求完成基础的层序遍历。


      大家要注意这几个点:


Queue里的泛型类型的TreeNode而不是Integer,它的功能是辅助我们让节点按照我们想要的顺序去排列

在while(!queue.isEmpty())前需要先把头结点放入队列,否则循环根本就无法进入了,这个循环判断的是整棵树是否被遍历完。

while(len-->0)是每一层遍历的起点,所以path是用来记录每一层的元素,遍历结束后它会被赋值一份放入到答案数组list中,而每次遍历开始时都会有一个新的path


len变量是用来区分二叉树的每一层级的


class Solution {
    //用来存放答案数组
    List<List<Integer>> list=new ArrayList<>();
    public List<List<Integer>> levelOrder(TreeNode root) {
        if(root==null) return list;
        bfs(root);
        return list;
    }
    public void bfs(TreeNode root){
             //辅助队列帮忙完成层序遍历
            Queue<TreeNode> queue=new LinkedList<>();
            //1.注意先要把头结点放进去,否则队列就为空了
            queue.offer(root);
            while(!queue.isEmpty()){
                //2.每一个path是用来遍历二叉树的每一层的
                List<Integer> path=new ArrayList();
                //len是当前队列的长度,也是我们即将遍历的一层的元素个数
                //len属性可以帮助我们去区分层与层之间
                int len=queue.size();
                while(len-->0){
                    //从队里弹一个元素
                    TreeNode node=queue.poll();
                    //用path记录下值
                    path.add(node.val);
                    //将非空的左右子结点加入队列
                    if(node.left!=null) queue.offer(node.left);
                    if(node.right!=null) queue.offer(node.right);
                }
                //走到这一步说明我们遍历完了一层,将记录下这层的path加入到我们的答案中
                list.add(new ArrayList(path));
            }
    }
}

image.png

https://ucc.alicdn.com/images/user-upload-01/3b3a0da2f80245c99c7c676ae67426cc.gif


👊2.二叉树的层序遍历||


给你二叉树的根节点 root ,返回其节点值 自底向上的层序遍历 。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)


题目链接:二叉树的层序遍历||https://leetcode-cn.com/problems/binary-tree-level-order-traversal-ii/


           这题和第一题的要求其实一样,只不过变成了从底向上层序遍历输入而已。难道我们真的从底向上层序遍历?当然不用,我们只需要把在上面的代码上改动一个地方即可,就是让每次把答案数组path加入到list的第一个位置也就是0下标处,这样就可以完成自底向上的层序遍历。


class Solution {
    List<List<Integer>> list=new ArrayList<>();
    //当然两道题的函数名不同
    public List<List<Integer>> levelOrderBottom(TreeNode root) {
        if(root==null) return list;
        bfs(root);
        return list;
    }
    public void bfs(TreeNode root){
            Queue<TreeNode> queue=new LinkedList<>();
            queue.offer(root);
            while(!queue.isEmpty()){
                List<Integer> path=new ArrayList();
                int len=queue.size();
                while(len-->0){
                    TreeNode node=queue.poll();
                    path.add(node.val);
                    if(node.left!=null) queue.offer(node.left);
                    if(node.right!=null) queue.offer(node.right);
                }
                //与第一道题唯一区别的地方
                list.add(0,new ArrayList(path));
            }
    }
}


相关文章
|
5月前
|
C++
【洛谷 P1618】三连击(升级版)题解(深度优先搜索+位集合)
`三连击(升级版)` 是一道编程题,要求将数字 $1$ 到 $9$ 分成三组,构成三个三位数,其比例为 $A:B:C$。给定 $A$, $B$, $C$,程序应找到所有可能的组合并按首位升序输出。输入为 $A$, $B$, $C$,输出是满足比例的三位数或&quot;No!!!&quot;(当无解时)。解决方案涉及全排列搜索和比例验证。提供的AC代码使用C++,通过位集记录数字使用情况,递归实现全排列。
66 0
|
存储 C++ 容器
五道超经典题目,带你手撕链表题(多种方法实现)下
五道超经典题目,带你手撕链表题(多种方法实现)
61 1
|
6月前
|
算法 Java 定位技术
【数据结构与算法】递归、回溯、八皇后 一文打尽!
【数据结构与算法】递归、回溯、八皇后 一文打尽!
|
6月前
|
API
【二叉树】练习题终章
【二叉树】练习题终章
49 0
|
算法
代码随想录算法训练营第三十一天 | LeetCode 455. 分发饼干、376. 摆动序列、53. 最大子数组和
代码随想录算法训练营第三十一天 | LeetCode 455. 分发饼干、376. 摆动序列、53. 最大子数组和
63 0
|
存储 算法 C语言
深度理解递归,手撕经典递归问题(汉诺塔,青蛙跳台阶),保姆级教学。
深度理解递归,手撕经典递归问题(汉诺塔,青蛙跳台阶),保姆级教学。
五道超经典题目,带你手撕链表题(多种方法实现)上
五道超经典题目,带你手撕链表题(多种方法实现)
111 0
|
存储
剑指offer 36. 复杂链表的复刻
剑指offer 36. 复杂链表的复刻
49 0
|
存储 关系型数据库 索引
B+树层数计算(面试官直呼内行)
首先搞清楚一个常识,我们都知道计算机在存储数据的时候,有最小存储单元,这就好比我们今天进行现金的流通最小单位是一毛 在计算机中磁盘存储数据最小单元是扇区,一个扇区的大小是 512 字节,而文件系统(例如XFS/EXT4)他的最小单元是块,一个块的大小是 4k
2104 0
|
存储 算法
学会二叉树不知道干啥?二叉树的深度优先搜索和广度优先搜索,我要打十个乃至二十个(打开你的LeetCode撸起来)学练并举
学会二叉树不知道干啥?二叉树的深度优先搜索和广度优先搜索,我要打十个乃至二十个(打开你的LeetCode撸起来)学练并举
学会二叉树不知道干啥?二叉树的深度优先搜索和广度优先搜索,我要打十个乃至二十个(打开你的LeetCode撸起来)学练并举