• 前言
  • 102.二叉树的层序遍历
    • 题目描述
    • 前提知识
    • 代码
  • 107二叉树的层序遍历II
    • 题目描述
    • 代码
  • 199.二叉树的右视图
    • 题目描述
    • 思路
    • 代码
  • 637.二叉树的层平均值
    • 题目描述
    • 思路
    • 代码
  • 429.N叉树的层序遍历
    • 题目描述
    • 思路
    • 代码
  • 515.在每个树行中找最大值
    • 题目描述
    • 思路
    • 代码
  • 116.填充每个节点的下一个右侧节点指针
    • 题目描述
    • 思路
    • 代码
  • 104.二叉树的最大深度
    • 题目描述
    • 思路
    • 代码
    • 其他人的解法
  • 111.二叉树的最小深度
    • 题目描述
    • 思路
    • 代码
    • 其他人的解法

前言

刷题路线来自代码随想录

102.二叉树的层序遍历

层序遍历

题目描述

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

前提知识

在解决这道题目之前,我们应该先了解什么是层序遍历
层序遍历一个二叉树。就是从左到右一层一层的去遍历二叉树。
队列先进先出,符合一层一层遍历的逻辑,我们可以使用队列来实现层序遍历

public void levelOrderTraversal(Node root){if(root==null){return;}Queue<Node> queue=new LinkedList<>();queue.offer(root);while(!queue.isEmpty()){Node node=queue.poll();System.out.print(node.val+" ");if(node.left!=null) {queue.offer(node.left);}if(node.right!=null) {queue.offer(node.right);}}
}

代码

class Solution {public List<List<Integer>> levelOrder(TreeNode root) {if(root==null) {return new ArrayList<List<Integer>>();}List<List<Integer>> res = new ArrayList<List<Integer>>();Queue<TreeNode> queue = new LinkedList<TreeNode>();//将根节点放入队列中,然后不断遍历队列queue.add(root);while(queue.size()>0) {//获取当前队列的长度,这个长度相当于 当前这一层的节点个数int size = queue.size();ArrayList<Integer> tmp = new ArrayList<Integer>();//将队列中的元素都拿出来(也就是获取这一层的节点),放到临时list中//如果节点的左/右子树不为空,也放入队列中for(int i=0;i<size;++i) {TreeNode t = queue.poll();tmp.add(t.val);if(t.left!=null) {queue.offer(t.left);}if(t.right!=null) {queue.offer(t.right);}}//将临时list加入最终返回结果中res.add(tmp);}return res;}
}

107二叉树的层序遍历II

107.二叉树的层序遍历II

题目描述

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

提示:

树中节点数目在范围 [0, 2000] 内
-1000 <= Node.val <= 1000

其实这题和上面那一题思路是一样的,只要最后再把集合中的元素反转一下就好了

代码

class Solution {public List<List<Integer>> levelOrderBottom(TreeNode root) {List<List<Integer>> list=new ArrayList();List<List<Integer>> rs=new ArrayList();if(root==null){return rs;}Queue<TreeNode> queue=new LinkedList();queue.offer(root);while(!queue.isEmpty()){//获取当层有多少元素int len=queue.size();List<Integer> temp=new ArrayList();for(int i=0;i<len;i++){TreeNode node= queue.poll();temp.add(node.val);if(node.left!=null){queue.offer(node.left);}if(node.right!=null){queue.offer(node.right);}}list.add(temp);}//反转for(int i=list.size()-1;i>=0;i--){rs.add(list.get(i));}return rs;}
}

199.二叉树的右视图

199.二叉树的右视图

题目描述

给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。

思路

层序遍历的时候,判断是否遍历到该层的最后面的元素,如果是,就放进list集合中,随后返回list就可以了。

代码

class Solution {public List<Integer> rightSideView(TreeNode root) {List<Integer> list=new ArrayList();Queue<TreeNode> queue=new LinkedList();if(root==null) return list;queue.offer(root);/**我们需要判断是否遍历当前层次的最后一个节点*/while(!queue.isEmpty()){int len=queue.size();for(int i=0;i<len;i++){TreeNode node=queue.poll();if(node.left!=null){queue.offer(node.left);}if(node.right!=null){queue.offer(node.right);}//判断是否遍历到最后一个节点if(i==len-1){list.add(node.val);}}}return list;}}

637.二叉树的层平均值

637.二叉树的层平均值

题目描述

给定一个非空二叉树的根节点 root , 以数组的形式返回每一层节点的平均值。与实际答案相差 10-5 以内的答案可以被接受。

提示:

树中节点数量在 [1, 104] 范围内
-231 <= Node.val <= 231 - 1

思路

我们只需要在层序遍历的时候,获取当前这层有多少元素,然后对他们的元素值进行相加,然后把平均值添加到list集合中

代码

class Solution {public List<Double> averageOfLevels(TreeNode root) {List<Double> list=new ArrayList();Queue<TreeNode> queue= new LinkedList();if(root==null){return list;}queue.offer(root);double sum=0.0;while(!queue.isEmpty()){//获取这一层有多少元素int len=queue.size();for(int i=0;i<len;i++){TreeNode node=queue.poll();sum+=node.val;if(node.left!=null){queue.offer(node.left);}if(node.right!=null){queue.offer(node.right);}}list.add( sum/len);sum=0;}return list;}
}

429.N叉树的层序遍历

题目描述

给定一个 N 叉树,返回其节点值的层序遍历。(即从左到右,逐层遍历)。

树的序列化输入是用层序遍历,每组子节点都由 null 值分隔(参见示例)。

提示:

树的高度不会超过 1000
树的节点总数在 [0, 10^4] 之间

思路

这题其实和二叉树的层序遍历思路一样,区别只是说,对于N叉树,一个节点可能有多个子节点

代码

class Solution {public List<List<Integer>> levelOrder(Node root) {if (root == null) {return new ArrayList<List<Integer>>();}List<List<Integer>> ans = new ArrayList<List<Integer>>();Queue<Node> queue = new ArrayDeque<Node>();queue.offer(root);while (!queue.isEmpty()) {int cnt = queue.size();List<Integer> level = new ArrayList<Integer>();for (int i = 0; i < cnt; ++i) {Node cur = queue.poll();level.add(cur.val);for (Node child : cur.children) {queue.offer(child);}}ans.add(level);}return ans;}
}

515.在每个树行中找最大值

515.在每个树行中找最大值

题目描述

给定一棵二叉树的根节点 root ,请找出该二叉树中每一层的最大值。

思路

层序遍历,用一个变量temp来记录当层已经遍历的节点的最大值,temp和当前节点的val比较,把二者的较大值赋值给temp

代码

class Solution {public List<Integer> largestValues(TreeNode root) {if(root==null){return new ArrayList<Integer>();}List<Integer> list = new ArrayList();Queue<TreeNode> queue = new LinkedList();queue.offer(root);while(!queue.isEmpty()){int len=queue.size();int temp=Integer.MIN_VALUE;for(int i=0;i<len;i++){TreeNode node= queue.poll();temp=Math.max(temp,node.val);if(node.left!=null){queue.offer(node.left);}if(node.right!=null){queue.offer(node.right);}}list.add(temp);}return list;}
}

116.填充每个节点的下一个右侧节点指针

116.填充每个节点的下一个右侧节点指针

题目描述

思路

在层序遍历的时候,我们需要判断一下,我们遍历的这个节点是不是这层的最后一个元素,如果不是最后一个元素,那么就让当前节点的next指向下一个节点

代码

class Solution {public Node connect(Node root) {if(root==null) return null;Queue<Node> queue=new LinkedList();queue.offer(root);while(!queue.isEmpty()){int len=queue.size();for(int i=0;i<len;i++){Node curr= queue.poll();//判断同一层是否还有节点//如果还有节点,则next指向下一个节点,否则指向空if(i!=len-1){//说明还有下一个节点,此时我们通过调用element方法获得对首元素,此时的队首元素就是当前节点的下一个节点curr.next=queue.element();}//把当前节点的左右孩子加入队列if(curr.left!=null){queue.offer(curr.left);}   if(curr.right!=null){queue.offer(curr.right);}             }}return root;}
}

104.二叉树的最大深度

104.二叉树的最大深度

题目描述

思路

使用迭代法的话,使用层序遍历是最为合适的,因为最大的深度就是二叉树的层数,和层序遍历的方式极其吻合。

在二叉树中,一层一层的来遍历二叉树,记录一下遍历的层数就是二叉树的深度

代码

//非递归
class Solution {public int maxDepth(TreeNode root) {if(root==null) return 0;int depth=0;Queue<TreeNode> queue=new LinkedList();queue.offer(root);while(!queue.isEmpty()){int len=queue.size();//只要把当前这一层所有的节点都出队,则depth+1for(int i=0;i<len;i++){TreeNode node=queue.poll();if(node.left!=null){queue.offer(node.left);}if(node.right!=null){queue.offer(node.right);}}depth++;}return depth;}
}

其他人的解法

ACM 选手图解 LeetCode 二叉树的最大深度(递归 + 非递归)| 编程文青李狗蛋

111.二叉树的最小深度

111.二叉树的最小深度

题目描述

给定一个二叉树,找出其最小深度。

最小深度是从根节点到最近叶子节点的最短路径上的节点数量。

说明:叶子节点是指没有子节点的节点。

思路

用层序遍历的方法遍历整棵树。
当我们找到一个叶子节点时,直接返回这个叶子节点的深度。广度优先搜索的性质保证了最先搜索到的叶子节点的深度一定最小。

代码

class Solution {public int minDepth(TreeNode root) {if (root == null) {return 0;}Queue<TreeNode> queue = new LinkedList<>();queue.offer(root);int depth = 0;while (!queue.isEmpty()){int size = queue.size();depth++;TreeNode cur = null;for (int i = 0; i < size; i++) {cur = queue.poll();//如果当前节点的左右孩子都为空,直接返回最小深度if (cur.left == null && cur.right == null){return depth;}if (cur.left != null) queue.offer(cur.left);if (cur.right != null) queue.offer(cur.right);}}return depth;}
}

其他人的解法

ACM 选手图解 LeetCode 二叉树的最小深度(递归 + 非递归)| 编程文青李狗蛋

二叉树层序遍历相关题目相关推荐

  1. 二叉树层序遍历_求二叉树的层序遍历

    题目描述 给定一个二叉树,返回该二叉树层序遍历的结果,(从左到右,一层一层地遍历) 例如: 给定的二叉树是{3,9,20,#,#,15,7}, 该二叉树层序遍历的结果是 [ [3], [9,20], ...

  2. 牛客-二叉树层序遍历

    牛客-二叉树层序遍历 #include <stdio.h> #include <queue> #include <stack> #include <math. ...

  3. 【LeetCode】专题一 二叉树层序遍历

    二叉树层序遍历 在本文中,我将会选取LeetCode上二叉树层序遍历的多道例题,并给出解答,通过多道题我们就可以发现,二叉树的层序遍历并不复杂,并且有着共通点. 102. 二叉树的层序遍历 给你二叉树 ...

  4. 数据结构:二叉树层序遍历和判断是否为完全二叉树

    层序遍历 从所在二叉树的根节点出发,首先访问第一层的树根节点,然后从左到右访问第二层上的节点,接着是第三层的节点,以此类推,自上而下,自左至右逐层访问树的节点的过程. while(队列!=NULL) ...

  5. 二叉树层序遍历分层[递归迭代两种思想+三种解法]

    层序遍历分层的递归迭代解法 前言 一.二叉树层序遍历分层 二.递归与迭代 总结 参考文献 前言 层序遍历作为二叉树遍历的基本遍历,一般来说只能用迭代来解.但是分层输出则既可用迭代,又可配合level用 ...

  6. 二叉树层序遍历(广度优先搜索)基础概念与经典题目(Leetcode题解-Python语言)

    二叉树的广度优先搜索即从上到下.从左到右地进行搜索,对于层序遍历(Level Order)问题,即依次遍历第一层节点.第二层节点-等,基本可以秒杀. 广度优先搜索是通过队列来实现的,python中优先 ...

  7. 二叉树层序遍历——java

    目录 一.题目 二.层序遍历顺序 三.思路(迭代法) 四.代码实现 一.题目 1.链接:力扣 2.内容:给你二叉树的根节点 root ,返回其节点值的 层序遍历 . (即逐层地,从左到右访问所有节点) ...

  8. 102 二叉树层序遍历

    层序遍历,每次层的输出是是一个一维数组,整个二叉树的输出结果是二维数组 BFS遍历,依托于队列结构,每次在根节点出栈的时候,将其值加在结果列表中,然后将他的左右孩子节点入队列. 层序遍历相对于BFS, ...

  9. BFS(二)二叉树层序遍历(I、II)、二叉树锯齿形层序遍历、N叉树层序遍历

    目录 102. 二叉树的层序遍历 107. 二叉树的层序遍历 II 103. 二叉树的锯齿形层序遍历 429. N 叉树的层序遍历 102. 二叉树的层序遍历 给你二叉树的根节点 root ,返回其节 ...

最新文章

  1. R语言dplyr包使用arrange函数、group_by函数、mutate函数生成分组数据的排名(rank)实战(Rank Variable by Group):升序排名、降序排名以及相同排名的处理
  2. 菜鸟教程 php跨域,PHP Ajax 跨域问题最佳解决方案
  3. [剑指offer][JAVA]面试题第[31]题[栈的压入、弹出序列][栈]
  4. 微信小程序,技术创业的时代可能要来了,但窗口期不会太长
  5. 采用循环链表结构求解约瑟夫问题
  6. 监控mysql锁定状态_Shell脚本监控MySQL主从状态
  7. 【论文分享】ACL 2020 图神经网络在自然语言处理中的应用
  8. php无法上传,为什么php 大文件无法上传
  9. CRC校验算法详解及代码实现
  10. 为什么要使用英英词典?
  11. 电脑主板报警声音的故障现象对照表
  12. 12、【易混淆概念集】-第六章3 资源平衡 VS 资源平滑 进度压缩 制定进度计划 定义活动 里程碑清单
  13. 最新版校园招聘进大厂系列----------(3)字节篇 -----未完待续
  14. 工业大数据分析建模和算法
  15. 论文翻译—Ciphertext-Policy Attribute-Based Encryption
  16. C# Microsoft.Office.Interop.Word设置Word页脚之添加当前页数
  17. PyTorch深度学习入门笔记(五)Transforms的使用
  18. [PCB]这里带你了解何为PCB?
  19. C Primer Plus基础教程(1)— 初步认识C语言
  20. C#怎样解析.CSV文件同时把类转换成JSON

热门文章

  1. (转)IOS App中揉合讯飞SDK功能详细
  2. gta java_Java输出hellow world
  3. 【Java面向对象】学习Java经典必刷题库
  4. 安徽阜阳计算机高中学校排名,安徽阜阳最牛的四大高中,有一所状元辈出、学霸成群,你知道吗?...
  5. 笔记本电脑截图的方法
  6. JavaScript实现3秒后跳转页面
  7. PVE 为虚拟机 直通硬盘
  8. 微信5秒超时 php异步,微信小程序网络超时怎么办?
  9. 小心这些创业点子:8个最糟糕创业开局
  10. Java Web实训项目:西蒙购物网(Simonshop)