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

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

🍓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));
            }
    }
}


相关文章
|
算法
代码随想录算法训练营第三十一天 | LeetCode 455. 分发饼干、376. 摆动序列、53. 最大子数组和
代码随想录算法训练营第三十一天 | LeetCode 455. 分发饼干、376. 摆动序列、53. 最大子数组和
70 0
|
算法 网络架构
代码随想录算法训练营第三十三天 | LeetCode 1005. K 次取反后最大化的数组和、134. 加油站、135. 分发糖果
代码随想录算法训练营第三十三天 | LeetCode 1005. K 次取反后最大化的数组和、134. 加油站、135. 分发糖果
63 0
|
存储 C++
【C++从0到王者】第二十八站:二叉搜索树的应用
【C++从0到王者】第二十八站:二叉搜索树的应用
54 0
|
存储 算法 C语言
深度理解递归,手撕经典递归问题(汉诺塔,青蛙跳台阶),保姆级教学。
深度理解递归,手撕经典递归问题(汉诺塔,青蛙跳台阶),保姆级教学。
|
机器学习/深度学习 算法 JavaScript
代码随想录训练营day31| 455.分发饼干 376. 摆动序列 53. 最大子序和
代码随想录训练营day31| 455.分发饼干 376. 摆动序列 53. 最大子序和
|
机器学习/深度学习 人工智能 算法
LeetCode 周赛 345(2023/05/14)体验一题多解的算法之美
大家好,我是小彭。这场周赛是 LeetCode 第 345 场单周赛,整体难度不高,我们使用一题多解的方式强化练习。
136 0
|
存储 移动开发
【蓝桥杯集训·每日一题】AcWing 1497. 树的遍历
文章目录 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 三、知识风暴 递归
78 0
|
存储 算法
学会二叉树不知道干啥?二叉树的深度优先搜索和广度优先搜索,我要打十个乃至二十个(打开你的LeetCode撸起来)学练并举
学会二叉树不知道干啥?二叉树的深度优先搜索和广度优先搜索,我要打十个乃至二十个(打开你的LeetCode撸起来)学练并举
学会二叉树不知道干啥?二叉树的深度优先搜索和广度优先搜索,我要打十个乃至二十个(打开你的LeetCode撸起来)学练并举
|
算法 程序员
拿捏汉诺塔问题(附有动图)
相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。
367 0
|
算法 Java C++
代码随想录刷题|LeetCode 1005.K次取反后最大化的数组和 134. 加油站 135. 分发糖果
代码随想录刷题|LeetCode 1005.K次取反后最大化的数组和 134. 加油站 135. 分发糖果