二叉树层序遍历分层[递归迭代两种思想+三种解法]
层序遍历分层的递归迭代解法
- 前言
- 一、二叉树层序遍历分层
- 二、递归与迭代
- 总结
- 参考文献
前言
层序遍历作为二叉树遍历的基本遍历,一般来说只能用迭代来解。但是分层输出则既可用迭代,又可配合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 二叉树的层序遍历分层
二叉树层序遍历分层[递归迭代两种思想+三种解法]相关推荐
- 算法(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后序遍 ...
- 二叉树的前序,中序,后序,层序遍历的递归和非递归实现
直接上代码 import java.util.Stack;public class BinaryTree {//定义一棵二叉树,包括左子树.右子树.该节点的值和构造器public BinaryTree ...
- Java 二叉树基础概念(递归迭代)
目录 1. 树型结构 1.1概念 1.2 概念(重要) 2. 二叉树(重点) 2.1 概念 2.2 二叉树的基本形态 2.3 两种特殊的二叉树 2.4 二叉树的性质 a.满二叉树 b.完全二叉树 2. ...
- 【LeetCode】专题一 二叉树层序遍历
二叉树层序遍历 在本文中,我将会选取LeetCode上二叉树层序遍历的多道例题,并给出解答,通过多道题我们就可以发现,二叉树的层序遍历并不复杂,并且有着共通点. 102. 二叉树的层序遍历 给你二叉树 ...
- 二叉树的遍历(递归,非递归,Morris)
二叉树的遍历 目录 递归遍历 非递归遍历 Morris遍历 1. 递归遍历 递归版遍历只要当前节点不为null,就可以三次回到当前节点. public static void preOrderRecu ...
- 二叉树的遍历(递归与非递归实现)
二叉树的遍历(递归与非递归实现) 二叉树的实现(三叉链表的形式) public class XieChaoThreeLinkBinTree<E> {public static class ...
- C++二叉树层序遍历
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 二叉树的分类 二叉树的遍历 1.递归法 2. 迭代法 **3. 层序遍历 总结 二叉树的分类 满二叉树:如果一棵二叉树只有度 ...
- 二叉树的遍历 (递归和非递归实现)
二叉树的遍历 (递归实现) 用C++实现二叉树的"先根遍历"存储. 用C++实现二叉树的"先根遍历"."中根遍历"."后根遍历&q ...
- 数据结构:二叉树层序遍历和判断是否为完全二叉树
层序遍历 从所在二叉树的根节点出发,首先访问第一层的树根节点,然后从左到右访问第二层上的节点,接着是第三层的节点,以此类推,自上而下,自左至右逐层访问树的节点的过程. while(队列!=NULL) ...
最新文章
- webuploader 怎么在react中_React 项目性能分析及优化
- AI进军摇滚圈,老炮:这是啥?
- CTFshow 命令执行 web72
- 基于 Spring Boot 的 Restful 风格实现增删改查
- 中台,都他妈被你们说糊涂了,文内才是正宗解释,别摸石头过河了,石头早就有了
- 蓝图设计对SAP项目实施的重要性
- Java方法中的参数太多,第5部分:方法命名
- caffe2安装篇(三)通过docker安装
- html5怎么设置字体闪动,HTML最简单的文字闪烁代码
- BootStrap笔记-img相关
- 应届生怒怼管理层后续:已离职、被标记永不录用?腾讯张军回应...
- canvas中文显示乱码 html5_40个常见的HTML5 面试问题及答案
- Mac 10.12安装数据库管理工具MySQL Workbench
- golang interface 类型转换_Golang面试题41道
- Sublime Text 使用记录汇总
- 再谈Objective C中的BOOL类型
- Java——事故应急
- 分区混乱,C盘不是系统盘怎么办?
- 解决:蓝奏云下载链接没法打开问题
- 导图解文 从梦想到财富(05)世界第八大奇迹,知者赚不知者被赚
热门文章
- java中浅拷贝和深拷贝_java中的浅拷贝和深拷贝
- 默纳克系统服务器怎么改不了参数,默纳克7000一体机调试参数
- 英语单词学习-16-40
- 自己DIY 一键 显示和 隐藏 mac os 文件 的小插件
- 西门子step7安装注册表删除_为什么不能安装STEP7 V5.5 SP4,注册表已经删除但是还是不行-工业支持中心-西门子中国...
- 新手小白如何在线制作流程图?
- 【FICO】COSS与COSP的区别是啥?
- 华三无线控制器配置802.1X认证
- html2canvas图片生成file格式传送到后台服务器
- (问题)vue打包时报错Cannot read property ‘__vueMarkdownOptions__‘ of undefined