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

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

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


相关文章
|
机器学习/深度学习 算法 安全
m基于深度学习网络的中药识别系统matlab仿真,包含GUI界面
在MATLAB 2022a中,一个基于GoogLeNet的中药识别系统展示了其仿真效果,通过6张图像展示了识别流程。该系统利用深度学习解决传统识别方法的局限,尤其是借助CNN自动提取中药图像特征。核心程序涉及数据集加载、分割、预训练模型加载以及网络调整,如替换GoogLeNet的特征学习层和分类器层以适应中药分类任务。
260 1
|
3月前
|
搜索推荐 算法 大数据
基于python大数据的旅游景点可视化与推荐系统
本系统基于大数据与网络技术,构建个性化旅游推荐平台。通过收集用户偏好及行为数据,结合机器学习算法,提供精准的旅游目的地、住宿及交通推荐,旨在优化旅游信息传递,提升用户决策效率与旅行体验。
|
存储 JSON 数据安全/隐私保护
"FastAPI身份验证与授权的奥秘:如何用Python打造坚不可摧的Web应用,让你的项目一鸣惊人?"
【8月更文挑战第31天】在现代Web开发中,保证应用安全性至关重要,FastAPI作为高性能Python框架,提供了多种身份验证与授权方式,包括HTTP基础认证、OAuth2及JWT。本文将对比这些机制并附上示例代码,展示如何使用HTTP基础认证、OAuth2协议以及JWT进行用户身份验证,确保只有合法用户才能访问受保护资源。通过具体示例,读者可以了解如何在FastAPI项目中实施这些安全措施。
641 1
|
虚拟化
vmware虚拟机使用主机代理访问谷歌
vmware虚拟机使用主机代理访问谷歌
1445 4
|
安全 网络安全 数据安全/隐私保护
青少年 CTF 练习平台:Misc(一)
青少年 CTF 练习平台:Misc(一)
|
图计算
软考高项笔记(一):进度类计算
本篇博文开始,笔者将分享在学习高项中所收获的知识,第一篇博文我要归纳的笔记是在软考上午选择题和下午案例题都很重要的计算题类型中的进度类计算笔记。本篇博文主要用于学习和交流。归纳总结不仅是学习的重要方法,也是一种分享的途径,我在此希望与各位准项目经理共同努力,为早日实现人生理想而奋斗!
2523 6
软考高项笔记(一):进度类计算
|
存储 关系型数据库 MySQL
gin框架学习-Casbin进阶之策略管理API使用方法
它有两个配置文件,model.conf和policy.csv。 其中,model.conf存储了访问模型,policy.csv存储了特定的用户权限配置。 Casbin的使用非常精炼。 基本上,我们只需要一个主要结构:enforcer。 当构建这个结构时,model.conf和policy.csv将被加载。
712 0
gin框架学习-Casbin进阶之策略管理API使用方法
|
SQL 存储 运维
15天学习MySQL计划-日志(运维篇)-第十二天
15天学习MySQL计划-日志(运维篇)-第十二天
247 1
|
Web App开发 搜索推荐 开发工具
超级实用!让你效率倍增的6款浏览器插件
浏览器插件具备内存占用小、使用频率高等特点,一款好用的浏览器插件能够极大的提高学习/办公效率,本文就来介绍6款让人不禁感叹相见恨晚的实用插件,文末有下载方式。
超级实用!让你效率倍增的6款浏览器插件
|
缓存 Android开发 开发者
View的这些基础知识你必须要知道,已拿到offer
View的这些基础知识你必须要知道,已拿到offer
View的这些基础知识你必须要知道,已拿到offer