代码随想录刷题笔记 DAY17 | 平衡二叉树 No.110 | 二叉树的所有路径 No.257 | 左叶子之和 No.404

Day 17

01. 平衡二叉树(No. 110)

题目链接

代码随想录题解

1.1 题目

给定一个二叉树,判断它是否是高度平衡的二叉树。

本题中,一棵高度平衡二叉树定义为:

一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。

示例 1:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

输入:root = [3,9,20,null,null,15,7]
输出:true

示例 2:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

输入:root = [1,2,2,3,3,null,null,4,4]
输出:false

示例 3:

输入:root = []
输出:true

提示:

  • 树中的节点数在范围 [0, 5000]
  • -104 <= Node.val <= 104
1.2 笔记

首先来回顾高度和深度的区别,先用这张图来描述节点的深度

接下来将其改造为展示高度的图像

高度和深度为 1 的位置是不同的,注意不是完全相反,高度为 1 的位置是所有没有子节点的位置,而深度为 1 的位置则一定是头节点(if not null),这也就使得求高度和深度的计算位置有所不同

深度是以上个节点为根基进行自增,而高度则需要以子节点为根基,一个节点的高度是 其左节点和右节点高度的最大值

所以求深度使用前序遍历,求高度使用后序遍历

在写递归之前先来看递归之前要考虑的三个部分:

  • 递归的出口:本题中的出口是 node == null 也就是遍历到最后一个节点的时候
  • 递归的返回值:因为要拿取到子节点的深度,这里返回值定为 int 为该节点的深度
  • 递归中要进行的步骤:遍历左节点求得高度、遍历右节点求得高度,取高度的最大值再加一

和之前提到的一样,不要在脑中取执行递归,脑子存不下几个栈的,这种存储的行为交给计算机去做,我们需要做的是想出上面的三个部分,以这个题为例,递归出口很好想出,接下来确定返回值,确定了是 深度

深度的逻辑是什么呢?

是左节点和右节点深度和的最大值。

那左节点和右节点的深度如何计算呢?

通过递归

想到这里就可以写出代码了,至于左节点右节点怎么计算,就是计算机执行的内容了,我们只负责 单层逻辑 的处理。

有了深度只需要在每次返回前判断左右子树的高度即可看出是否是平衡二叉树

1.3 代码
class Solution {// 最终的返回值boolean flg = true;public boolean isBalanced(TreeNode root) {reverse(root);return flg;}public int reverse(TreeNode node) {if (node == null) {return 0;}int rightNum = reverse(node.right);int leftNum = reverse(node.left);// 判断是否平衡if (rightNum - leftNum > 1 || leftNum - rightNum > 1) {flg = false;}return Math.max(rightNum, leftNum) + 1;}
}

02. 二叉树的所有路径(No. 257)

题目链接

代码随想录题解

2.1 题目

给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。

叶子节点 是指没有子节点的节点。

示例 1:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

输入:root = [1,2,3,null,5]
输出:[“1->2->5”,“1->3”]

示例 2:

输入:root = [1]
输出:[“1”]

提示:

  • 树中节点的数目在范围 [1, 100]
  • -100 <= Node.val <= 100
2.2 笔记

代码随想录刷题笔记 DAY16 | 二叉树的最大深度 No.104 | 二叉树的最小深度 No.111 | 完全二叉树的节点个数 No.222

这道题和昨天的二叉树的最小深度很像,都有判断叶子节点的步骤,叶子节点就是返回结果的位置,从头节点开始,通过 path 来记录通过的路径,在离开节点的时候弹出当前节点的记录即可实现路径的遍历。

最后将 path 转为需要的格式返回即可

再次回顾递归的三个步骤

  • 确认递归的出口,本题有两个出口,第一个是 node == null 也就是遍历到空节点的时候,但空节点并非一定是叶子节点,比如下图

    如果仅仅通过 node == null 来判断,这些节点的上一个节点都会被判定为叶子节点,也就是 1 2 3 节点均会判定为叶子节点,所以还需要限制 left == nullright == null 这才能准确的定位到 3 节点。

  • 递归的返回值:使用 path 来收集信息,直接 return 即可,返回值为空

  • 每层递归的逻辑:(前序位置:判断条件、记录当前路径)、(遍历左节点、遍历右节点)、(后序位置:弹出节点的值)

2.3 代码
class Solution {List<String> res = new ArrayList<String>(); // 返回的结果List<String> path = new ArrayList<String>(); // 收集路径信息public List<String> binaryTreePaths(TreeNode root) {reverse(root);return res;}public void reverse(TreeNode node) {// 前序位置if (node == null) {return;}path.add(String.valueOf(node.val));// 判断是否是叶子节点if (node.right == null && node.left == null) {String resString = getResString(path);res.add(resString);path.remove(path.size() - 1);return;}reverse(node.left);reverse(node.right);// 后序位置,离开节点时弹出path.remove(path.size() - 1);}/*将 path 转为需要的结果的方法*/public String getResString(List<String> path) {String resString = "";for (int i = 0; i < path.size() - 1; i++) {resString += path.get(i) + "->";}resString += path.get(path.size() - 1);return resString;}
}

03. 左叶子之和(No. 404)

题目链接

代码随想录题解

3.1 题目
  • 给定二叉树的根节点 root ,返回所有左叶子之和。

    示例 1:

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    输入: root = [3,9,20,null,null,15,7]
    输出: 24
    解释: 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24

    示例 2:

    输入: root = [1]
    输出: 0

    提示:

    • 节点数在 [1, 1000] 范围内
    • -1000 <= Node.val <= 1000
3.2 笔记

这道题首先要搞懂左叶子是哪个位置,来看下面这张图

如果问这张图的左叶子之和很有可能会得到两个结果,9 + 3 + 15 = 27 3 + 15 = 18,凭字面理解,很明显是第二个对了,因为要找的是 左叶子节点 而非 左分支节点,所以和上题一样,要加判断是否为叶子节点的代码,我认为这题很适合作为递归的一个例题,因为本题的递归三步法比较复杂。

先来确认遍历顺序,本题要收集叶子节点也就是子节点的情况,所以使用 后序遍历

同样的,来确认三个部分

  • 递归的出口:node == null 这是毋庸置疑的,因为对空节点的任何操作都没有意义
  • 递归的返回值,返回节点的 左叶子 的值,因为如果在一个节点内部,是很难判断是左叶子还是右叶子的,所以要交给上一级节点取判断。
  • 递归中执行的内容:(前序位置:检查是否为空节点、拿取节点左叶子的值(if not null))、(遍历左节点、遍历右节点)、(后续位置:返回当前节点以下所有 左叶子 的值)

这里再稍微提及一下如何判断叶子节点:首先它自己不能为空,同时左右节点都为空,但本题是交给上个节点取判断的,就从下面的代码变成了

if (node != null && node.right == null && node.left == null) {temp = node.val;
}
if (node.left != null && node.left.right == null && node.left.left == null) {temp = node.left.val;
}

写出代码

3.3 代码
class Solution {public int sumOfLeftLeaves(TreeNode root) {return reverse(root);}public int reverse(TreeNode node) {int temp = 0;if (node == null) {return 0;}// 判断左叶子if (node.left != null && node.left.right == null && node.left.left == null) {// 当前节点的左叶子的值(如果存在的话),注意是左叶子temp = node.left.val;}int leftNum = reverse(node.left);int rightNum = reverse(node.right);return leftNum + rightNum + temp;}
}

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

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

相关文章

LabVIEW直流电机转速检测与控制

研究了使用LabVIEW软件和ELVIS实验平台来检测和控制直流电机的转速。通过集成光电传感器和霍尔传感器&#xff0c;实现了对电机转速的精确测量和调节。 系统组成&#xff1a;系统由NI ELVIS实验平台、光电传感器、霍尔传感器和直流电机组成。通过这些硬件元件&#xff0c;系统…

架构篇19:单服务器高性能模式-Reactor与Proactor

文章目录 ReactorProactor小结上篇介绍了单服务器高性能的 PPC 和 TPC 模式,它们的优点是实现简单,缺点是都无法支撑高并发的场景,尤其是互联网发展到现在,各种海量用户业务的出现,PPC 和 TPC 完全无能为力。今天我将介绍可以应对高并发场景的单服务器高性能架构模式:Rea…

如何本地搭建Tale博客网站并发布到公网分享好友远程访问——“cpolar内网穿透”

文章目录 前言1. Tale网站搭建1.1 检查本地环境1.2 部署Tale个人博客系统1.3 启动Tale服务1.4 访问博客地址 2. Linux安装Cpolar内网穿透3. 创建Tale博客公网地址4. 使用公网地址访问Tale 前言 今天给大家带来一款基于 Java 语言的轻量级博客开源项目——Tale&#xff0c;Tale…

C/C++编码问题研究

文章目录 一、Unicode字符集与U8/U16/U32编码二、编码1. 占字节数2. ASCII、GB2312、GBK、GB18030 以及 UTF8 的关系3. BOM4. UTF-8的存储实现 三、编译器字符集设置1. GCC语法Example 2. MSVC语法Example 三、wchar_t五、编码转换函数六、代码 & 实践1. UTF8与UTF16、UTF3…

机器学习系列 16:使用 scikit-learn 的 Pipeline

在机器学习项目中&#xff0c;我们经常需要进行大量的数据预处理步骤&#xff0c;最后用处理干净的数据集来拟合机器学习算法得到一个合适的机器学习模型。 scikit-learn 提供了一个强大的 Pipeline 类来帮助我们将所有的数据预处理步骤和训练模型的步骤串起来。就像流水线一样…

数据目录驱动测试——深入探讨Pytest插件 pytest-datadir

在软件测试中,有效管理测试数据对于编写全面的测试用例至关重要。Pytest插件 pytest-datadir 提供了一种优雅的解决方案,使得数据目录驱动测试变得更加简单而灵活。本文将深入介绍 pytest-datadir 插件的基本用法和实际案例,助你更好地组织和利用测试数据。 什么是pytest-da…

重写Sylar基于协程的服务器(0、搭建开发环境以及项目框架 || 下载编译简化版Sylar)

重写Sylar基于协程的服务器&#xff08;0、搭建开发环境以及项目框架 || 下载编译简化版Sylar&#xff09; 重写Sylar基于协程的服务器系列&#xff1a; 重写Sylar基于协程的服务器&#xff08;0、搭建开发环境以及项目框架 || 下载编译简化版Sylar&#xff09; 前言 sylar是…

搜索<2>——记忆化搜索与剪枝

Part 1:记忆化搜索 记忆化搜索其实就是拿个数组记录下已经得到的值&#xff0c;这样再遇到的时候直接调用即可。 P1464: 虽然此题好像不用记忆化也行&#xff0c;但我们还是老老实实写个记忆化吧。没什么困难的地方&#xff0c;就是它叫你怎么干你就怎么干&#xff0c;记得开…

PDA移动终端怎样解决货物管理混乱问题

在现代物流仓储行业中&#xff0c;货物管理混乱、信息不准确是一个普遍存在的问题。为了解决这一难题&#xff0c;PDA移动终端应运而生&#xff0c;通过其强大的数据采集功能、丰富传输功能、丰富联网方式和高防护性能等&#xff0c;为物流仓储企业提供了一种全新的解决方案。 …

jenkins pipeline配置maven可选参数

1、在Manage Jenkins下的Global Tool Configuration下对应的maven项添加我们要用得到的不同版本的maven安装项 2、pipeline文件内容具体如下 我们maven是单一的&#xff0c;所以我们都是配置单选参数 pipeline {agent anyparameters {gitParameter(name: BRANCH_TAG, type: …

【笔试常见编程题03】统计回文、连续最大和、不要二、把字符串转换成整数

1. 统计回文 “回文串”是一个正读和反读都一样的字符串&#xff0c;比如“level”或者“noon”等等就是回文串。花花非常喜欢这种拥有对称美的回文串&#xff0c;生日的时候她得到两个礼物分别是字符串A和字符串B。现在她非常好奇有没有办法将字符串B插入字符串A使产生的字符串…

Mysql运维篇(三) MySQL备份与恢复

一路走来&#xff0c;所有遇到的人&#xff0c;帮助过我的、伤害过我的都是朋友&#xff0c;没有一个是敌人。如有侵权&#xff0c;请留言&#xff0c;我及时删除&#xff01; 一、物理备份与逻辑备份 1、物理备份&#xff1a;备份数据文件&#xff0c;转储数据库物理文件到某…

Web 开发 9:Django 框架基础

在本篇文章中&#xff0c;我们将深入探讨 Django 框架的基础知识。Django 是一个功能强大且流行的 Python Web 框架&#xff0c;它提供了一套完整的工具和功能&#xff0c;用于开发高效、可扩展的 Web 应用程序。 什么是 Django&#xff1f; Django 是一个基于 Python 的免费…

【qt】switchBtn

方法1 在qtdesigner中设置按钮图标的三个属性&#xff0c;normal off 、normal on和checkabletrue。 from PyQt5.QtWidgets import * from PyQt5.QtGui import * from PyQt5.QtCore import * from PyQt5 import uic from switchBtn import Ui_Dialogclass Test(QDialog, Ui_…

Python判断语句——if语句的基本格式

一、引言 在Python编程语言中&#xff0c;if语句是一种基本的控制流语句&#xff0c;用于根据特定条件执行不同的代码块。它的基本格式相对简单&#xff0c;使得Python代码清晰、易于阅读。下面&#xff0c;我们将深入探讨if语句的基本格式、用法和注意事项。 二、if语句的…

Date类型转成字符类型(String),字符类型(String)转成Date类型

效果图 注意&#xff1a;不建议使用YYYY-MM-dd HH:mm:ss格式&#xff0c;使用yyyy-MM-dd HH:mm:ss格式 import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date;public class DateTimeDemo {public static void main(String[] args) thro…

群辉开启WebDav服务+cpolar内网穿透实现移动端ES文件浏览器远程访问本地NAS文件

文章目录 1. 安装启用WebDAV2. 安装cpolar3. 配置公网访问地址4. 公网测试连接5. 固定连接公网地址6. 使用固定地址测试连接 本文主要介绍如何在群辉中开启WebDav服务&#xff0c;并结合cpolar内网穿透工具生成的公网地址&#xff0c;通过移动客户端ES文件浏览器即可实现移动设…

电路笔记 :MOS场效应晶体管+红外遥控+AMS1117 电源模块

三极管&#xff08;BJT&#xff0c;Bipolar Junction Transistor&#xff09;和 MOSFET&#xff08;Metal-Oxide-Semiconductor Field-Effect Transistor&#xff09;是两种不同类型的晶体管&#xff0c;它们在工作原理、性能特性和应用方面有一些重要的区别。 结构和工作原理…

大模型学习笔记一:大模型应开发基础(模型归类选型、安全因素选型、)

文章目录 一、大模型一些概念介绍二、市面上大模型对比三、大模型使用安全选型四、使用大模型的方式&#xff08;一问一答、Agent Function Calling、RAG、Fine-tuning五、大模型使用路线九、补充说明1&#xff09;注意力机制讲解 一、大模型一些概念介绍 1&#xff09;产品和大…

时序预测 | Python基于Multihead-Attention-TCN-LSTM的时间序列预测

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 时序预测 | Python基于Multihead-Attention-TCN-LSTM的时间序列预测 Multihead-Attention-TCN-LSTM&#xff08;多头注意力-TCN-LSTM&#xff09;是一种结合了多个注意力机制、时序卷积网络&#xff08;TCN&#xff0…