【刷题笔记】二叉树2

1 二叉树的层序遍历

        上一期我们讲了关于二叉树的前序、中序以及后序遍历的相关内容。然而,还存在一种遍历方式,这种方式非常符合我们人类的正常思维,可以求解很多树相关的问题,比较暴力——二叉树的层序遍历。

        二叉树的层序遍历与前中后序遍历分别对应于图论中的广度优先和深度优先搜索,大家可以好好体会深度和广度这两个词。画个图来增强理解:

        像左图一层一层的遍历就是广度优先,类似于二叉树的层序遍历,像右边这种,一个方向一个方向的遍历就是深度优先,类似于我们的前中后序遍历。 

2 解法套路

        二叉树的层序遍历,有非常明显的套路。102. 二叉树的层序遍历,以这道题为例,先贴代码:

    public List<List<Integer>> levelOrder(TreeNode root) {List<List<Integer>> res = new ArrayList<>();if (root == null) {return res;}Deque<TreeNode> deque = new LinkedList();deque.push(root);while (!deque.isEmpty()) {int size = deque.size();List<Integer> path = new ArrayList<>();while (size-- > 0) {TreeNode p = deque.pollFirst();path.add(p.val);if (p.left != null) {deque.addLast(p.left);}if (p.right != null) {deque.addLast(p.right);}}res.add(path);}return res;}

        (1)定义一个队列,先把树的头节点放入队列头。

        (2)定义一个循环,如果队列不为空,就一直循环下去。

        (3)求队列的长度,这个长度代表了树当前层的节点数。

        (4)然后,开始从队列中弹出所有元素,每弹出一个元素,就把他的左节点和右节点加入到队列的尾部,当这一层所有节点都被弹完后,是不是下一层就重新填充了队列。

        (5)直到最后一层。

3 相关例题

3.1 二叉树的层序遍历Ⅱ

107. 二叉树的层序遍历 II

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

    public List<List<Integer>> levelOrderBottom(TreeNode root) {List<List<Integer>> res = new ArrayList<>();if (root == null) {return res;}Deque<TreeNode> deque = new LinkedList<>();deque.push(root);while (!deque.isEmpty()) {int size = deque.size();List<Integer> list = new ArrayList<>();while (size-- > 0) {TreeNode node = deque.pollFirst();list.add(node.val);if (node.left != null) {deque.addLast(node.left);}if (node.right != null) {deque.addLast(node.right);}}res.add(0, list);}return res;}

        这道题和上面的例题,几乎完全相同,只不过是从下往上输出。那我们可以利用List列表的特性,每次都在0的位置add,最后展示的时候就是从下往上。

3.2 二叉树的层平均值

637. 二叉树的层平均值

        给定一个非空二叉树的根节点 root , 以数组的形式返回每一层节点的平均值。与实际答案相差 10^{-5} 以内的答案可以被接受。(这句话告诉我们定义sum的时候要用double)

    public List<Double> averageOfLevels(TreeNode root) {List<Double> res = new ArrayList<>();Deque<TreeNode> deque = new LinkedList();deque.push(root);while (!deque.isEmpty()) {int size = deque.size();Double sum = 0d;int nums = size;while (size-- > 0) {TreeNode pop = deque.pop();sum += pop.val;if (pop.left != null) {deque.addLast(pop.left);}if (pop.right != null) {deque.addLast(pop.right);}}res.add(sum / nums);}return res;}

        这道题用层序做非常简单,但是也可以用前序遍历去做,大家可以思考一下,怎么用前序做,下一期我会给出详解。

3.3 N叉树的层序遍历

429. N 叉树的层序遍历

        给定一个 N 叉树,返回其节点值的层序遍历。(即从左到右,逐层遍历)。树的序列化输入是用层序遍历,每组子节点都由 null 值分隔。

    public List<List<Integer>> levelOrder(Node root) {List<List<Integer>> res = new ArrayList<>();if (root == null) {return res;}Deque<Node> deque = new LinkedList<>();deque.push(root);while (!deque.isEmpty()) {int size = deque.size();List<Integer> list = new ArrayList<>();while (size-- > 0) {Node pop = deque.pop();list.add(pop.val);if (pop.children != null) {for (Node child : pop.children) {deque.addLast(child);}}}res.add(list);}return res;}

        万变不离其宗,二叉树都是左节点、右节点,N叉树是一个节点下面挂了一个列表,列表中装着它的孩子节点,与二叉树对应,那就每次队列弹出这个节点的时候就把它的孩子节点列表遍历了,都从队列尾部装进去就好了。

3.4 二叉树层最大值

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

    public List<Integer> largestValues(TreeNode root) {List<Integer> res = new ArrayList<>();if (root == null) {return res;}Deque<TreeNode> deque = new LinkedList<>();deque.push(root);while (!deque.isEmpty()) {int size = deque.size();int maxValue = deque.peek().val;while (size-- > 0) {TreeNode pop = deque.pop();maxValue = Math.max(maxValue, pop.val);if (pop.left != null) {deque.addLast(pop.left);}if (pop.right != null) {deque.addLast(pop.right);}}res.add(maxValue);}return res;}

        这道题同样可以用前序遍历去做,但是层序比较容易想,且时间复杂度和前序都是O(N),所以还是建议大家用层序去做。下一期会出前序解法。、

4 总结

        二叉树的层序遍历套路非常明显,可以解决很多树的问题,不过用层序解答的结果就是时间复杂度都是O(N),所以层序遍历适合那些无论如何都要遍历整棵树的题,例如,求层平均值、求层最大值、求二叉树最大深度、求二叉树最小深度,这些题是你要把整棵树遍历完才能知道答案的,但是用前中后序(深度优先)遍历也可以解决,且时间复杂度也是O(N),只不过相比之下可能层序更容易想。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/402299.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

读软件开发安全之道:概念、设计与实施01基础

1. 基础 1.1. 实现软件安全既需要运用逻辑&#xff0c;又是一项艺术 1.1.1. 一项仰赖直觉来做出判断的艺术 1.1.2. 需要践行者对当代数字系统有所掌 1.1.3. 需要他们对人与系统之间的交互有所体悟 1.2. 需要准确地思考一下何谓安全 1.2.1. 安全定义的主观性颇强&#xff0…

HarmonyOS开发:跨应用数据共享详解

目录 前言跨应用数据共享的重要性HarmonyOS的数据共享能力相关的基本概念跨应用数据共享的数据管理具体实现跨应用数据共享延伸&#xff1a;数据共享的安全和隐私结语 前言 现在的移动操作系统中&#xff0c;应用之间的数据共享已成为提升用户体验和实现功能互补的重要手段&a…

watch 和 watchEffect 的隐藏点 --- 非常细致

之前有一篇文章讲述了 watch 和 watchEffect 的使用&#xff0c;但在实际使用中&#xff0c;仍然存在一些“隐藏点”&#xff0c;可能会影响开发&#xff0c;在这补充一下。 1. watch 的隐藏点 1.1 性能陷阱&#xff1a;深度监听的影响 当在 watch 中使用 deep: true 来监听…

[MRCTF2020]套娃1

打开题目&#xff0c;查看源代码&#xff0c;有提示 有两层过滤 1.过滤"_"与"%5f" 。 这里要求的参数必须是"b_u_p_t"但是不能检测出"_"。这里看着很作弄人。其实这里要用到php里非法参数名的问题。可以参考一下博客 ?b.u.p.t2333…

Python爬虫技术与K-means算法的计算机类招聘信息获取与数据分析

有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主 目录 摘要.... 1 Abstract 2 1 引言.... 3 1.1 研究背景... 3 1.2 国内外研究现状... 4 1.3 研究目的... 5 1.4 研究意义... 7 2 关键技术理论介绍... 7 2.1 Python爬虫... 7 2.1 K-means…

微软开源库 Detours 详细介绍与使用实例分享

目录 1、Detours概述 2、Detours功能特性 3、Detours工作原理 4、Detours应用场景 5、Detours兼容性 6、Detours具体使用方法 7、Detours使用实例 - 使用Detours拦截系统库中的UnhandledExceptionFilter接口&#xff0c;实现对程序异常的拦截 C软件异常排查从入门到精通…

VMware虚拟机下安装Ubuntu22.04以及汉化配置保姆级教程

目录 一.VMware和Ubuntu下载 二.在VMware中创建Ubuntu 1.点击 创建新的虚拟机 2.选择典型 3.选择Ubuntu镜像包&#xff08;自定义存放的位置&#xff09; 4.创建个人信息&#xff08;密码一定要牢记&#xff09; 5.选择虚拟机的安装位置 6.其他配置项&#xff08;默认下…

Unity Obfuscator 使用说明

一、Assembly - Settings 1. 核心Unity程序集&#xff08;Assembly-CSharp&#xff09; Obfuscate Assembly-CSharp: 开启 这是Unity的核心程序集&#xff0c;所有没有存储在程序集定义文件&#xff08;assembly definition file&#xff09;中的代码都会被存储在这里。大多数…

C++多态详解

1. 多态的概念 多态就是函数调用的多种形态&#xff0c;使用多态能够使得不同的对象去完成同一件事时&#xff0c;产生不同的动作和结果。 举个栗子&#xff1a;比如买票这个行为&#xff0c;当普通人买票时&#xff0c;是全价买票&#xff1b;学生买票时&#xff0c;是半价买…

yolov5网络初始化问题

当你打印detect层的三个特征层时&#xff0c;发现有三种不同的长和宽&#xff0c;如下图所示&#xff1a; 我提出三个问题&#xff1a; 为什么不一样呢&#xff0c;输入有什么含义吗&#xff1f; 为什么网络初始化四次&#xff08;forward)&#xff1f; 下面来逐个击破 1. torc…

uniapp 微信小程序生成水印图片

效果 源码 <template><view style"overflow: hidden;"><camera device-position"back" flash"auto" class"camera"><cover-view class"text-white padding water-mark"><cover-view class"…

【笔记】泰山派环境配置遇到E: Unable to locate package repo

答案来自通义千问&#xff0c;解决了我的问题&#xff0c;做一些记录 你尝试在Ubuntu或Debian系统上使用apt命令安装repo工具&#xff0c;但是遇到了问题&#xff0c;因为repo不是直接在软件源中作为一个独立的包提供的。repo是Google的一个Git仓库管理工具&#xff0c;通常用…

EasyCVR视频汇聚平台:打造全栈视频监控系统的基石,解锁可视化管理与高效运维

随着科技的飞速发展&#xff0c;视频监控已成为现代社会不可或缺的一部分&#xff0c;广泛应用于社区、公共场所、工业领域等多个场景。EasyCVR视频汇聚平台&#xff0c;作为一款高性能的视频汇聚管理平台&#xff0c;凭借其强大的视频处理、汇聚与融合能力&#xff0c;在构建全…

数据结构——关于栈

1.栈 1.1栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作 进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出的原则 比如&#xff1a;羽毛球桶&#xff0c;弹夹等等 压…

苍穹外卖项目DAY05

苍穹外卖项目DAY05 1、店铺营业状态设置 1.1、Redis入门 Redis简介 Redis是一个基于内存的key-value结构数据库 基于内存存储&#xff0c;读写性能高适合存储热点数据&#xff08;热点商品、咨询、新闻&#xff09;企业应用广泛 中文网&#xff1a;https://www.redis.net…

【Java学习】Stream流详解

所属专栏&#xff1a;Java学习 Stream流是JDK 8引入的一个概念&#xff0c;它提供了一种高效且表达力强的方式来处理数据集合&#xff08;如List、Set等&#xff09;或数组。Stream API可以以声明性方式&#xff08;指定做什么&#xff09;来处理数据序列。流操作可以被分为两大…

[C++][opencv]基于opencv实现photoshop算法灰度化图像

测试环境】 vs2019 opencv4.8.0 【效果演示】 【核心实现代码】 BlackWhite.hpp #ifndef OPENCV2_PS_BLACKWHITE_HPP_ #define OPENCV2_PS_BLACKWHITE_HPP_#include "opencv2/core.hpp"namespace cv {class BlackWhite { public:float red; //红色的灰度系…

阿里云ubuntu系统安装mysql8.0

一、安装mysql8.0 1.已安装其他版本的mysql&#xff0c;需要删除 若没有不需要此操作 1 #卸载MySQL5.7版本 2 apt remove -y mysql-client5.7* mysql-community-server5.7* 4 # 卸载5.7的仓库信息 5 dpkg-l | grep mysql | awk iprint $2} | xargs dpkg -P2.更新仓库 apt u…

Python酷库之旅-第三方库Pandas(084)

目录 一、用法精讲 351、pandas.Series.str.isdigit方法 351-1、语法 351-2、参数 351-3、功能 351-4、返回值 351-5、说明 351-6、用法 351-6-1、数据准备 351-6-2、代码示例 351-6-3、结果输出 352、pandas.Series.str.isspace方法 352-1、语法 352-2、参数 3…

0815,析构函数,拷贝构造函数,赋值运算符函数

来自同济医院的问候 目录 01&#xff1a;对象创建 001.cc 003size.cc 02&#xff1a;对象销毁 004pointer.cc 005destroytime.cc 03&#xff1a;本类型对象的复制 3.1 拷贝构造函数 006cp.cc 007cptime.cc 008recursion.cc 009rightleft.cc 3.2 赋值运算符函数 …