广度优先搜索(BFS)的基本思想:

在二叉树上进行BFS遍历(对上图解释的代码实现)

//BFS  使用队列void bfs (TreeNode root){     Queuequeue=new ArrayDeque<>();     queue.add(root);     while(!queue.isEmpty()){         TreeNode node=queue.poll();//队头元素出队         //这个队头元数出队完成后,对其左右子节点进行入队         if(node.left!=null){queue.add(node.left);}         if(node.right!=null){queue.add(node.right);}     }}

广度优先思想在本题上的应用

BFS 遍历的结果集是一个一维数组,这题(层序遍历)期望的结果是一个二维数组。因此许需要对BFS遍历的结果集进行分层。

在BFS对二叉树进行遍历的时候,数组中会有不同层元素同时存在的情况,且这种情况下,无法区分哪些元素是来自哪一层。如下图:

因此可以在每一层遍历开始前,先记录队列中的结点数量(也就是这一层的结点数量),然后一口气处理完这一层的n个结点。

下面给出实现代码:

void bfs(TreeNode root){    Queuequeue=new ArrayLise();    queue.add(root);    while(!queue.isEmpty()){        int n=queue.size();        for(int i=0;i            //变量i无实际意义,只是为了循环             TreeNode node=queue.poll();//队头元素出队             //这个队头元数出队完成后,对其左右子节点进行入队             if(node.left!=null){queue.add(node.left);}             if(node.right!=null){queue.add(node.right);}        }     }}

对上面的代码进行适当的修改就可以得出本题的代码:

class Solution {    //外部list的元素个数就是树的层数    //里面list的元素的个数就是树的每层元素个数    public List> levelOrder(TreeNode root) {        List> levels = new ArrayList>();        Queue queue=new ArrayDeque();        if(root!=null)  queue.add(root);        while(!queue.isEmpty()){            List level=new ArrayList();            int size= queue.size();            for(int i=0;i                TreeNode node=queue.poll();                level.add(node.val);                if(node.left!=null) queue.add(node.left);                if(node.right!=null) queue.add(node.right);            }            levels.add(level);        }        return levels;        }

参考文章:https://mp.weixin.qq.com/s?__biz=MzA5ODk3ODA4OQ==&mid=2648167212&idx=1&sn=6af5ffe5b69075b21bb4743ddcee4e7c&chksm=88aa236abfddaa7cae70b42edb299d0a52d9f1cc4fc1fdba1116972fc0ca0275b8bfdf10851b&token=1607921395&lang=zh_CN#rd

下面再给出一个递归解法:

//递归解法Class Solution{    List<List> levels=new ArrayList<List>();        public void helper(TreeNode node,int level){        //在这种情况下要新建一个内部list用来存储新的一层元素        if(levels.size()==level){            levels.add(new ArrayList());        }        //新建完一层之后,把刚才传入的结点添加到这个新建的内部list        levels.get(level).add(node.val);        //这个结点处理完成之后,处理这个结点的左子结点        //由于左子结点位于这个结点的下一层,所以层数要加一        if(node.left!=null) helper(node.left,level+1);        //处理完成这个结点的左子结点后,处理右子结点        if(node.right!=null) helper(node.left,level+1);    }    public List<List> levelOrder(TreeNode root){    if(root==null)  return levlels;        helper(root,0)    return levels       }       }

二叉树外部节点_leetcode 102 二叉树的层序遍历1 /BFS相关推荐

  1. 转载:二叉树的前中后和层序遍历详细图解(递归和非递归写法)

    二叉树的前中后和层序遍历详细图解(递归和非递归写法) Monster_ii 2018-08-27 17:01:53 50530 收藏 403 分类专栏: 数据结构拾遗 文章标签: 二叉树 前序 中序 ...

  2. 【手把手带你刷好题】—— 48.二叉树的层序遍历(BFS)

    [前言] 今天是刷题打卡第48天! 早成者未必有成,晚达者未必不达.一起都还来得及,加油哦. 原题: 二叉树的层序遍历(BFS) 原题链接:力扣 示例: 代码执行: class Solution { ...

  3. c++根据二叉树的层次遍历建立二叉树_LeetCode | 102.二叉树的层次遍历

    这次来写一下 LeetCode 的第 102 题,二叉树的层次遍历. 题目描述 题目直接从 LeetCode 上截图过来,题目如下: 102.二叉树的层次遍历题目 上面的题就是 二叉树的层次遍历 题目 ...

  4. java求出遍历二叉树的路径,102. 二叉树的层序遍历

    题目描述 给你一个二叉树,请你返回其按 层序遍历 得到的节点值. (即逐层地,从左到右访问所有节点). 3 / \ 9 20 / \ 15 7 返回其层次遍历结果: [ [3], [9,20], [1 ...

  5. 按层次遍历二叉树_LeetCode | 102.二叉树的层次遍历

    这次来写一下 LeetCode 的第 102 题,二叉树的层次遍历. 题目描述 题目直接从 LeetCode 上截图过来,题目如下: 上面的题就是 二叉树的层次遍历 题目的截图,同时 LeetCode ...

  6. 二叉树基本操作:利用队列实现层序遍历

    利用队列实现层序遍历 关于二叉树其他的基本操作可以看我前几篇文章: 二叉树的基本操作:二叉树的后序遍历非递归算法 二叉树的遍历:前序非递归和中序非递归 二叉树基本操作:二叉树的创建与递归遍历 基础知识 ...

  7. 二叉树系列二:二叉树的层序遍历(BFS)

      二叉树的层次遍历是指从根节点开始,沿着树的宽度一层一层向下遍历,比如下图的二叉树,层次遍历的顺序为:A-B-C-D-E-F-G,那层次遍历如何实现呢? 我们需要借助一个队列,由于队列是先进先出的, ...

  8. PAT甲级1094 The Largest Generation:[C++题解]邻接表存树、每层节点数量、vector模拟bfs层序遍历、bfs另类实现

    文章目录 题目分析 题目链接 题目分析 来源:PAT网站 题意重述:求一棵树中结点数量最多的层数,并输出最大的数量. 分析:使用邻接矩阵存储树,bool型变量g[N][N] 邻接矩阵,如果有边 置为t ...

  9. leetcode 102.二叉树的层序遍历

    难度:中等 频率:150 题目: 给你一个二叉树,请你返回其层序遍历得到的节点值(逐层,从左到右访问所有节点) 做这道题 之前先回忆一下数据结构里的 BFS(Breath First Search,广 ...

最新文章

  1. Django博客系统项目需求分析
  2. 【并发编程】线程池--Executor框架
  3. 开发好还是实施好_公众号开发 选择模板好还是选择定制发好
  4. jvm性能调优实战 - 26一个每秒10万并发的系统如何频繁发生Young GC的
  5. 什么叫开关电源?捏碎了喂给你吃!
  6. jmeter 非gui 模式跑jmx
  7. centos7 lldb 调试netcore应用的内存泄漏和死循环示例(dump文件调试)
  8. 中大博士偷偷做了这件事,今天终于曝光了...
  9. Win7的电脑屏幕如何优化设置
  10. 4 手把手,整合 RabbitMQ Spring 家族
  11. 《Linux编程》作业 ·002【Shell编程】
  12. 课程 3: Content Providers 简介
  13. ios是否安装了某应用
  14. 细说共模干扰和差模干扰
  15. 批量启用AD中账户的Exchange邮箱
  16. 苹果home键失灵_苹果手机屏幕失灵售后教你怎么处理
  17. PPT学习(一)——PPT默认设置
  18. 微信小程序预览 word、excel、ppt、pdf 等文件
  19. 随机函数rand()[c++]
  20. 神经网络 注意力机制 Q K V 理解

热门文章

  1. HTML5 服务器推送事件(Server-sent Events)实战开发
  2. 中国三大轴承厂是 哪三家?
  3. check上传模板中的金额字段中的千分位
  4. python函数与方法表,基于Python 函数和方法的区别说明
  5. 视频播放的方法Android,详解Android App中使用VideoView来实现视频播放的方法
  6. r语言quantmond_GitHub - QUANTAXIS/quant
  7. 如何解决java乱码_java如何解决乱码
  8. 银河足球队 android 8,银河足球队手机版_银河足球队安卓游戏v1.0.1-游迅网
  9. javafx应用启动自动执行函数_一张图,理顺 Spring Boot应用在启动阶段执行代码的几种方式...
  10. 金蝶显示中间服务器忙,金蝶显示云服务器繁忙怎么回事