层序遍历分层的递归迭代解法

  • 前言
  • 一、二叉树层序遍历分层
  • 二、递归与迭代
  • 总结
  • 参考文献

前言

层序遍历作为二叉树遍历的基本遍历,一般来说只能用迭代来解。但是分层输出则既可用迭代,又可配合level用前序遍历来解。

一、二叉树层序遍历分层

二、递归与迭代

package com.xhu.offer.everyday;import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;//层序遍历
public class LevelOrder {/*target:对二叉树进行层次遍历。如何拿到每一层节点?每一层节点都是上层节点的左右孩子,只要有序拿到上层parent,就能有序拿到下层children。以root开始,以队列来体现有序进出。如何明确的分层?记录每一层的size,取一个就减一个直到为0,再取队列的size作为当前层的cnt.*/public List<List<Integer>> levelOrder(TreeNode root) {List<List<Integer>> rs = new ArrayList<>();if (null == root) return rs;Queue<TreeNode> cur = new LinkedList<>();cur.add(root);//bug1:root为null时,也会作为TreeNode的null状态加入队列。int cnt = cur.size();List<Integer> el = new ArrayList<>();while (!cur.isEmpty()) {TreeNode node = cur.poll();el.add(node.val);if (node.left != null) cur.add(node.left);if (null != node.right) cur.add(node.right);if (--cnt == 0) {rs.add(el);el = new ArrayList<>();cnt = cur.size();}}return rs;}// Definition for a binary tree node.public class TreeNode {int val;TreeNode left;TreeNode right;TreeNode() {}TreeNode(int val) {this.val = val;}TreeNode(int val, TreeNode left, TreeNode right) {this.val = val;this.left = left;this.right = right;}}}/*
用TreeNode数组 + len + cur_index来替代队列
每层有各自的list和cur_index.*/
class LevelOrder2 {/*target:对二叉树进行层次遍历。如何拿到每一层节点?每一层节点都是上层节点的左右孩子,只要有序拿到上层parent,就能有序拿到下层children。以root开始,以队列来体现有序进出。如何明确的分层?每层有各自的list和cur_index*/public List<List<Integer>> levelOrder(TreeNode root) {List<List<Integer>> rs = new ArrayList<>();if (null == root) return rs;TreeNode[] cur = new TreeNode[2000];cur[0] = root;int len = 1, idx = 0, cnt = 1;List<Integer> el = new ArrayList<>();while (len != idx) {TreeNode node = cur[idx++];el.add(node.val);if (node.left != null) cur[len++] = node.left;if (null != node.right) cur[len++] = node.right;if (--cnt == 0) {rs.add(el);el = new ArrayList<>();cnt = len - idx;}}return rs;}// Definition for a binary tree node.public class TreeNode {int val;TreeNode left;TreeNode right;TreeNode() {}TreeNode(int val) {this.val = val;}TreeNode(int val, TreeNode left, TreeNode right) {this.val = val;this.left = left;this.right = right;}}}/*
鉴于每一层都放到各自的list中(结果要求),所以采用递归配合level,把节点放入相应的list即可。*/
class LevelOrder3 {/*鉴于每一层都放到各自的list中(结果要求),所以采用递归配合level,把节点放入相应的list即可。*/public List<List<Integer>> levelOrder(TreeNode root) {List<List<Integer>> rs = new ArrayList<>();if (null == root) return rs;order(root, rs, 0);return rs;}/*** 递归遍历,配合level完成各层到各家。** @param root* @param rs* @param level*/private void order(TreeNode root, List<List<Integer>> rs, int level) {if (root == null) return;//前序遍历,第一次达到这种深度,则生成当前层的list。if (level == rs.size()) {List<Integer> el = new ArrayList<>();rs.add(el);}List<Integer> cur = rs.get(level);cur.add(root.val);order(root.left, rs, level + 1);order(root.right, rs, level + 1);}// Definition for a binary tree node.public class TreeNode {int val;TreeNode left;TreeNode right;TreeNode() {}TreeNode(int val) {this.val = val;}TreeNode(int val, TreeNode left, TreeNode right) {this.val = val;this.left = left;this.right = right;}}}

总结

1)层序遍历:直接迭代+队列。
2)层序遍历分层:迭代+计数;递归+level。
3)层序遍历时,秉着基本数据类型或jvm层面的数组类型快,可用TreeNode数组来代替Queue这种类,可以提高速度。

参考文献

[1] LeetCode 二叉树的层序遍历分层

二叉树层序遍历分层[递归迭代两种思想+三种解法]相关推荐

  1. 算法(2)-二叉树的遍历(递归/迭代)python实现

    二叉树的遍历 1.深度优先DFS 1.1 DFS 递归解法 1.1.1先序遍历 1.1.2中序遍历 1.1.3后序遍历 1.2 DFS迭代解法 1.2.1先序遍历 1.2.2中序遍历 1.2.3后序遍 ...

  2. 二叉树的前序,中序,后序,层序遍历的递归和非递归实现

    直接上代码 import java.util.Stack;public class BinaryTree {//定义一棵二叉树,包括左子树.右子树.该节点的值和构造器public BinaryTree ...

  3. Java 二叉树基础概念(递归迭代)

    目录 1. 树型结构 1.1概念 1.2 概念(重要) 2. 二叉树(重点) 2.1 概念 2.2 二叉树的基本形态 2.3 两种特殊的二叉树 2.4 二叉树的性质 a.满二叉树 b.完全二叉树 2. ...

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

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

  5. 二叉树的遍历(递归,非递归,Morris)

    二叉树的遍历 目录 递归遍历 非递归遍历 Morris遍历 1. 递归遍历 递归版遍历只要当前节点不为null,就可以三次回到当前节点. public static void preOrderRecu ...

  6. 二叉树的遍历(递归与非递归实现)

    二叉树的遍历(递归与非递归实现) 二叉树的实现(三叉链表的形式) public class XieChaoThreeLinkBinTree<E> {public static class ...

  7. C++二叉树层序遍历

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 二叉树的分类 二叉树的遍历 1.递归法 2. 迭代法 **3. 层序遍历 总结 二叉树的分类 满二叉树:如果一棵二叉树只有度 ...

  8. 二叉树的遍历 (递归和非递归实现)

    二叉树的遍历 (递归实现) 用C++实现二叉树的"先根遍历"存储. 用C++实现二叉树的"先根遍历"."中根遍历"."后根遍历&q ...

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

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

最新文章

  1. webuploader 怎么在react中_React 项目性能分析及优化
  2. AI进军摇滚圈,老炮:这是啥?
  3. CTFshow 命令执行 web72
  4. 基于 Spring Boot 的 Restful 风格实现增删改查
  5. 中台,都他妈被你们说糊涂了,文内才是正宗解释,别摸石头过河了,石头早就有了
  6. 蓝图设计对SAP项目实施的重要性
  7. Java方法中的参数太多,第5部分:方法命名
  8. caffe2安装篇(三)通过docker安装
  9. html5怎么设置字体闪动,HTML最简单的文字闪烁代码
  10. BootStrap笔记-img相关
  11. 应届生怒怼管理层后续:已离职、被标记永不录用?腾讯张军回应...
  12. canvas中文显示乱码 html5_40个常见的HTML5 面试问题及答案
  13. Mac 10.12安装数据库管理工具MySQL Workbench
  14. golang interface 类型转换_Golang面试题41道
  15. Sublime Text 使用记录汇总
  16. 再谈Objective C中的BOOL类型
  17. Java——事故应急
  18. 分区混乱,C盘不是系统盘怎么办?
  19. 解决:蓝奏云下载链接没法打开问题
  20. 导图解文 从梦想到财富(05)世界第八大奇迹,知者赚不知者被赚

热门文章

  1. java中浅拷贝和深拷贝_java中的浅拷贝和深拷贝
  2. 默纳克系统服务器怎么改不了参数,默纳克7000一体机调试参数
  3. 英语单词学习-16-40
  4. 自己DIY 一键 显示和 隐藏 mac os 文件 的小插件
  5. 西门子step7安装注册表删除_为什么不能安装STEP7 V5.5 SP4,注册表已经删除但是还是不行-工业支持中心-西门子中国...
  6. 新手小白如何在线制作流程图?
  7. 【FICO】COSS与COSP的区别是啥?
  8. 华三无线控制器配置802.1X认证
  9. html2canvas图片生成file格式传送到后台服务器
  10. (问题)vue打包时报错Cannot read property ‘__vueMarkdownOptions__‘ of undefined