当前位置: 首页 > 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;这个插件似乎目前只支持微…...

seo sem公司如何制定营销策略

SEO SEM公司如何制定有效的营销策略 在当今数字化时代&#xff0c;SEO&#xff08;搜索引擎优化&#xff09;和SEM&#xff08;搜索引擎营销&#xff09;已经成为企业推广和品牌建立的关键组成部分。无论是中小企业还是大型跨国公司&#xff0c;它们都需要高效、精准的营销策略…...

3张表搞定财务BP工作!财务BP必须会的3张表

做了这么多年财务数据分析&#xff0c;我发现国内很多公司的财务BP&#xff0c;还停留在自己造表的阶段。每人一套表&#xff0c;格式五花八门&#xff0c;数据口径对不上。结果就是BP花大量时间在拉表、对数的琐事上&#xff0c;真正花在业务分析和决策支持上的时间少之又少。…...

大厂高薪抢手!文科生如何抓住AI时代机遇,实现职业逆袭?

大厂纷纷高薪招聘文科生&#xff0c;引发社会关注。文科生凭借沟通、叙事、逻辑等优势&#xff0c;在大模型理解人类价值观、企业品牌宣传等方面发挥作用。高校也调整专业设置&#xff0c;培养跨学科人才。文章建议文科生根据自身专业&#xff0c;向文案策划、品牌宣传、法务、…...

聊天记录会消失?这款开源工具让数据永远属于你

聊天记录会消失&#xff1f;这款开源工具让数据永远属于你 【免费下载链接】WeChatMsg 提取微信聊天记录&#xff0c;将其导出成HTML、Word、CSV文档永久保存&#xff0c;对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/WeChatMsg …...

别再看水刊了!智能故障诊断领域投稿,这20+个SCI期刊才是你的目标(附避坑指南)

智能故障诊断领域投稿指南&#xff1a;20高价值SCI期刊与避坑策略 对于从事智能故障诊断研究的学者而言&#xff0c;选择合适的SCI期刊投稿是研究成果获得认可的关键一步。本文将系统梳理该领域的优质期刊资源&#xff0c;帮助您避开常见陷阱&#xff0c;提高投稿成功率。 1. 智…...

国产N32芯片开发避坑指南:J-Link在Keil中的特殊配置(含Cortex-M0配置模板)

国产N32芯片开发实战&#xff1a;J-Link调试配置深度解析与Keil环境优化 在国产MCU生态快速崛起的背景下&#xff0c;N32系列芯片凭借优异的性价比和本土化服务优势&#xff0c;正逐步成为工程师替代进口方案的新选择。然而&#xff0c;从传统ST芯片转向国产平台时&#xff0c;…...

CSS 滚动驱动动画:让页面动起来的新维度

CSS 滚动驱动动画&#xff1a;让页面动起来的新维度代码如诗&#xff0c;滚动如歌。让我们用滚动驱动动画的魔法&#xff0c;为用户带来沉浸式的浏览体验。什么是滚动驱动动画&#xff1f; 滚动驱动动画&#xff08;Scroll-driven Animations&#xff09;是 CSS 中一项革命性的…...

企业微信考勤自动化解决方案:基于EasyWeChat的实战指南

企业微信考勤自动化解决方案&#xff1a;基于EasyWeChat的实战指南 【免费下载链接】easywechat &#x1f4e6; 一个 PHP 微信 SDK 项目地址: https://gitcode.com/gh_mirrors/ea/easywechat 在数字化办公普及的今天&#xff0c;企业考勤管理面临着数据采集繁琐、统计分…...

LongCat-Video:AI视频生成技术的范式突破与实践指南

LongCat-Video&#xff1a;AI视频生成技术的范式突破与实践指南 【免费下载链接】LongCat-Video 项目地址: https://ai.gitcode.com/hf_mirrors/meituan-longcat/LongCat-Video 在数字内容创作领域&#xff0c;AI视频生成技术正经历从实验性探索到产业化应用的关键转折…...

Go开发工具终极对决:GoLand与VSCode深度评测与实战指南

1. Go开发工具的选择困境 刚接触Go语言那会儿&#xff0c;我像大多数新手一样纠结&#xff1a;到底该用哪个开发工具&#xff1f;市面上主流的GoLand和VSCode各有拥趸&#xff0c;论坛里的讨论经常演变成"编辑器党"和"IDE党"的论战。经过三年多的实战&…...