当前位置: 首页 > news >正文

代码随想录【Day16】| 110. 平衡二叉树、257. 二叉树的所有路径、404. 左叶子之和

110. 平衡二叉树

题目链接

题目描述:
给定一个二叉树,判断它是否是高度平衡的二叉树。

本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。

示例 1:

给定二叉树 [3,9,20,null,null,15,7]
在这里插入图片描述
返回 true 。

示例 2:

给定二叉树 [1,2,2,3,3,null,null,4,4]
在这里插入图片描述
返回 false 。

难点:

  • 二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数。
  • 二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数。

思路:
要求比较高度,必然是要后序遍历。

时间复杂度:O()
空间复杂度:O()

class Solution {public boolean isBalanced(TreeNode root) {if (root == null) return true;return !(getHeight(root) == -1);}private int getHeight(TreeNode root) {if (root == null) return  0; //空结点高度为0int leftH = getHeight(root.left);if (leftH == -1) return -1;int rightH = getHeight(root.right);if (rightH == -1) return -1;return Math.abs(leftH-rightH) > 1 ? -1 : 1+Math.max(leftH, rightH);}
}

时长:
15min

收获:
区分深度与高度
递归方法练习


257. 二叉树的所有路径

题目链接

题目描述:
给定一个二叉树,返回所有从根节点到叶子节点的路径。

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

示例:
在这里插入图片描述

难点:

思路:

时间复杂度:O()
空间复杂度:O()

class Solution {List<String> resList = new ArrayList<>();public List<String> binaryTreePaths(TreeNode root) {if (root == null) return resList;List<Integer> path = new ArrayList<>();traversal(root, path);return resList;}private void traversal(TreeNode root, List<Integer> path) {path.add(root.val);if (root.left == null && root.right == null) {StringBuilder sb = new StringBuilder();for (int i = 0; i < path.size()-1; i++) {sb.append(path.get(i)).append("->");}sb.append(path.get(path.size()-1));resList.add(sb.toString());return;}if (root.left != null) {traversal(root.left, path);path.remove(path.size()-1);}if (root.right != null) {traversal(root.right, path);path.remove(path.size()-1);}}
}

如果想隐藏回溯,要小心了

if (root.left != null) {traversal(root.left, path.append("->"));
}
if (root.right != null) {traversal(root.right, path.append("->"));
}

这么写大错特错!因为通过path.append方法,字符串元素是累计添加到path中,退出函数时,并不能达到回溯的目的!!!
正确的做法是new一个StringBuilder对象作为参数传入

class Solution {List<String> resList = new ArrayList<>();public List<String> binaryTreePaths(TreeNode root) {if (root == null) return resList;StringBuilder path = new StringBuilder();traversal(root, path);return resList;}private void traversal(TreeNode root, StringBuilder path) {path.append(root.val);if (root.left == null && root.right == null) {resList.add(path.toString());return;}if (root.left != null) {traversal(root.left, new StringBuilder(path).append("->"));}if (root.right != null) {traversal(root.right, new StringBuilder(path).append("->"));}}
}

当然,使用字符串拼接实现会更容易:

List<String> resList = new ArrayList<>();public List<String> binaryTreePaths(TreeNode root) {if (root == null) return resList;String path = "";traversal(root, path);return resList;}private void traversal(TreeNode root, String path) {path += root.val;if (root.left == null && root.right == null) {resList.add(path);return;}if (root.left != null) {traversal(root.left, path+"->");}if (root.right != null) {traversal(root.right, path+"->");}}

迭代法:

class Solution {public List<String> binaryTreePaths(TreeNode root) {List<String> result = new ArrayList<>();if (root == null)return result;Stack<Object> stack = new Stack<>();// 节点和路径同时入栈stack.push(root);stack.push(root.val + "");while (!stack.isEmpty()) {// 节点和路径同时出栈String path = (String) stack.pop();TreeNode node = (TreeNode) stack.pop();// 若找到叶子节点if (node.left == null && node.right == null) {result.add(path);}//右子节点不为空if (node.right != null) {stack.push(node.right);stack.push(path + "->" + node.right.val);}//左子节点不为空if (node.left != null) {stack.push(node.left);stack.push(path + "->" + node.left.val);}}return result;}
}

时长:
13min

收获:
注意拼接字符串的细节


404. 左叶子之和

题目链接

题目描述:
计算给定二叉树的所有左叶子之和。

示例:
在这里插入图片描述

难点:

思路:
找左叶子之和
核心判断:当前节点是否有左孩子?左孩子是否为叶子?

时间复杂度:O()
空间复杂度:O()

这样写是不对的!
变量值sum没有返回。。。什么原因?

public int sumOfLeftLeaves(TreeNode root) {int sum = 0;traversal(root, sum);return sum;
}
private void traversal(TreeNode root, int sum) {if (root == null) return;if (root.left != null && root.left.left == null && root.left.right == null) {sum += root.left.val;}traversal(root.left, sum);traversal(root.right, sum);
}

sum不能通过函数的形参传入!!!

int sum = 0;
public int sumOfLeftLeaves(TreeNode root) {traversal(root);return sum;
}
private void traversal(TreeNode root) {if (root == null) return;if (root.left != null && root.left.left == null && root.left.right == null) {sum += root.left.val;}traversal(root.left);traversal(root.right);
}

迭代法:

// 先序遍历
class Solution {public int sumOfLeftLeaves(TreeNode root) {if (root == null) return 0;Stack<TreeNode> stack = new Stack<> ();stack.add(root);int result = 0;while (!stack.isEmpty()) {TreeNode node = stack.pop();if (node.left != null && node.left.left == null && node.left.right == null) {result += node.left.val;}if (node.right != null) stack.add(node.right);if (node.left != null) stack.add(node.left);}return result;}
}// 层序遍历
class Solution {public int sumOfLeftLeaves(TreeNode root) {int sum = 0;if (root == null) return 0;Queue<TreeNode> queue = new LinkedList<>();queue.offer(root);while (!queue.isEmpty()) {int size = queue.size();while (size -- > 0) {TreeNode node = queue.poll();if (node.left != null) { // 左节点不为空queue.offer(node.left);if (node.left.left == null && node.left.right == null){ // 左叶子节点sum += node.left.val;}}if (node.right != null) queue.offer(node.right);}}return sum;}
}

时长:
10min

收获:
参数传递

相关文章:

代码随想录【Day16】| 110. 平衡二叉树、257. 二叉树的所有路径、404. 左叶子之和

110. 平衡二叉树 题目链接 题目描述&#xff1a; 给定一个二叉树&#xff0c;判断它是否是高度平衡的二叉树。 本题中&#xff0c;一棵高度平衡二叉树定义为&#xff1a;一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。 示例 1: 给定二叉树 [3,9,20,null,nul…...

套娃式工具!用 AI 识别 AI ?#AI classifier

2022年以来&#xff0c;市面上就出现了不少 AI 生成文本的工具&#xff0c;尤其是 OpenAI 推出的 ChatGPT &#xff0c;不仅能够协助完成撰写邮件、视频脚本、文案、翻译、代码等任务&#xff0c;还能通过学习和理解人类的语言来进行对话&#xff0c;并根据聊天的上下文进行互动…...

CURL error 60: SSL certificate problem: certificate has expired

项目使用guzzleHttp做的一个接口&#xff0c;报错&#xff1a;certificate has expired 因为在linux centos环境与window环境有所不同&#xff0c;在此记录一下解决过程。 目录 报错提示 原因 解决方式 1.去掉guzzlehttp的验证 2.更新CA证书 总结 报错提示 cURL error 60…...

接口自动化:requests

引言&#xff1a;目前软件测试对测试人员的能力要求 业务测试能力&#xff1a;占比5-6成接口、自动化、性能测试能力&#xff1a;占比4-5成流程规范&#xff1a;1成&#xff08;需要综合型的测试人才&#xff09;&#xff1a;业务能力、代码能力、开发思维&#xff08;封装&…...

极简TypeScript教程--数据类型

TypeScript最大的特点就是有类型检测&#xff0c;格式为let/const 标识符: 数据类型 赋值;例子:let msg: string Hello World这样msg这个变量就有了字符串类型,如果再给他赋值为数字类型&#xff0c;就会在编译期报错。变量的类型推导在开发中&#xff0c;有时候为了方便起见…...

JAVA开发测试(jmeter如何测试性能与估算)

对C的业务网站或应用&#xff0c;进行性能测试来评估使用服务器情况是必不可少的一项工作。 一、测试工具&#xff1a; Apache JMeter 可以用于对服务器、网络或对象模拟巨大的负载&#xff0c;来自不同压力类别下测试它们的强度和分析整体性能&#xff0c;是Apache组织开发的…...

【新解法】华为OD机试 - 求解连续数列 | 备考思路,刷题要点,答疑,od Base 提供

华为 OD 清单查看地址:blog.csdn.net/hihell/category_12199275.html 求解连续数列 | 备考思路,刷题要点,答疑,od Base 提供 题目 已知连续正整数数列{K}=K1,K2,K3… Ki的各个数相加之和为S, i = N (0 < S < 100000, 0 < N < 100000), 求此数列K。 输入 输…...

Python3 File(文件) 方法

Python3 File(文件) 方法 open() 方法 Python open() 方法用于打开一个文件&#xff0c;并返回文件对象。 在对文件进行处理过程都需要使用到这个函数&#xff0c;如果该文件无法被打开&#xff0c;会抛出 OSError。 注意&#xff1a;使用 open() 方法一定要保证关闭文件对…...

APP渗透抓包

APP渗透抓包1.APP渗透测试原理2.安装安卓模拟器抓包2.1.安装模拟器2.2.设置代理下载证书2.2.1.burp suite设置代理2.2.2.浏览器设置代理2.2.3.下载证书2.3.模拟器安装证书2.3.1.移动证书2.3.2.证书设置2.4.设置代理2.4.1.设置burp suite代理2.4.2.夜神模拟器代理2.5.抓包测试2.…...

力扣(LeetCode)414. 第三大的数(2023.02.16)

给你一个非空数组&#xff0c;返回此数组中 第三大的数 。如果不存在&#xff0c;则返回数组中最大的数。 示例 1&#xff1a; 输入&#xff1a;[3, 2, 1] 输出&#xff1a;1 解释&#xff1a;第三大的数是 1 。 示例 2&#xff1a; 输入&#xff1a;[1, 2] 输出&#xff1a;2…...

Spring底层

一、什么是Spring&#xff1f;谈谈你对IOC和AOP的理解。Spring&#xff1a; 是一个企业级java应用框架&#xff0c;他的作用主要是 简化软件的开发以及配置过程&#xff0c;简化项目部署环境。Spring的有点&#xff1a;1、Spring低侵入设计&#xff0c;对业务代码的污染非常低。…...

Cache-Control 常见字段

Cache-Control 常见字段 参考&#xff1a;https://blog.csdn.net/qq_41996454/article/details/108644436 Cache-Control 可以在请求头或者响应头中设置&#xff0c;并且可以组合使用多种指令 no-cache 和 no-store 用作控制缓存&#xff0c;被服务器通过响应头 Cache-Contro…...

Flink Checkpoint 中的通用增量Checkpoint

文章目录知识点状态Flink容错恢复周期性的 Checkpoint错误检测 Failure Detected重新调度 Re-scheduling状态恢复 State Recovery通用增量Checkpoint知识点 状态 算子需要记录之前数据处理的中间结果&#xff0c;把中间结果暂时缓存在算子的内部&#xff0c;这就是算子的状态…...

金三银四必看的软件测试面试题宝典,背完offer随便拿

怎么来设计测试方案根据测试需求&#xff08;包括功能需求和非功能性需求&#xff09;&#xff0c;识别测试要点&#xff0c;识别测试环境要求&#xff0c;安排测试轮次&#xff0c;根据项目计划和开发计划做整体的测试安排。 被测试的特性&#xff1a;通过对需求规格说明书进行…...

企业电子招标采购系统源码Spring Cloud + Spring Boot +二次开发+ MybatisPlus + Redis

一、立项管理 1、招标立项申请 功能点&#xff1a;招标类项目立项申请入口&#xff0c;用户可以保存为草稿&#xff0c;提交。 2、非招标立项申请 功能点&#xff1a;非招标立项申请入口、用户可以保存为草稿、提交。 3、采购立项列表 功能点&#xff1a;对草稿进行编辑&#x…...

扬帆优配“数字经济+实体经济”融合发展,行业增长空间大!

组织以为&#xff0c;数字经济已经逐步成为工业商场和资本商场的共同主题。 2月16日&#xff0c;国家发改委在《求是》杂志发表文章《努力推进经济完成质的有效提升和量的合理增加》。文章指出要加速开展数字经济&#xff0c;加速实施“东数西算”等重大工程&#xff0c;推进数…...

分享82个HTML电脑主机模板,总有一款适合您

分享82个HTML电脑主机模板&#xff0c;总有一款适合您 82个HTML电脑主机模板下载链接&#xff1a;https://pan.baidu.com/s/13DGOCgvbxSksMPwJzi2z0g?pwdl0mi 提取码&#xff1a;l0mi Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 云虚拟主机运营商网站模板…...

.htaccess语法教程

RewriteEngine On RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$ RewriteCond %{REQUEST_URI} !^/blog/ RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ /blog/$1# 没有输入文件名的默认到到首页 RewriteCond %{HTTP_HOST} ^(w…...

C++ ——多态 下 (图解多态原理、虚函数的再认知)

目录 一、抽象类 1&#xff09;抽象类定义 2&#xff09;抽象类的继承 3&#xff09;抽象类实现多态 4&#xff09;抽象类的好处 二、多态的实现原理 1&#xff09;虚函数的存储方式 2&#xff09;子类中虚函数的存储方式 ① 子类将基类中的虚表原封不动的拷贝到自己的…...

cocos creater 3.x 构建QQ小游戏

一、目前 cocos creater 不支持直接构建QQ小游戏&#xff0c;需要构建成微信小游戏&#xff0c;然后修改成QQ小游戏 二、构建QQ小游戏不能勾选 分离引擎 的选项&#xff0c;勾选分离引擎的选项&#xff0c;需要安装cocos微信小游戏引擎插件&#xff0c;这个插件似乎目前只支持微…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

智慧医疗能源事业线深度画像分析(上)

引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;加密货币作为一种新兴的金融现象&#xff0c;正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而&#xff0c;加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下&#xff0c;稳定…...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇&#xff0c;相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程&#xff0c;其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线&#xff0c; n r n_r nr​ 根接收天线的 MIMO 系…...

Java 二维码

Java 二维码 **技术&#xff1a;**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

安卓基础(aar)

重新设置java21的环境&#xff0c;临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的&#xff1a; MyApp/ ├── app/ …...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求&#xff0c;本次涉及的主要是收费汇聚交换机的配置&#xff0c;浪潮网络设备在高速项目很少&#xff0c;通…...

现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?

现有的 Redis 分布式锁库&#xff08;如 Redisson&#xff09;相比于开发者自己基于 Redis 命令&#xff08;如 SETNX, EXPIRE, DEL&#xff09;手动实现分布式锁&#xff0c;提供了巨大的便利性和健壮性。主要体现在以下几个方面&#xff1a; 原子性保证 (Atomicity)&#xff…...

MySQL 部分重点知识篇

一、数据库对象 1. 主键 定义 &#xff1a;主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 &#xff1a;确保数据的完整性&#xff0c;便于数据的查询和管理。 示例 &#xff1a;在学生信息表中&#xff0c;学号可以作为主键&#xff…...