day17 二叉树part04

110. 平衡二叉树

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

class Solution {public boolean isBalanced(TreeNode root) {return (getHeight(root) == -1) ? false : true; }public int getHeight(TreeNode node){//遇到空节点了为终止,返回0,表示当前节点为根节点的树高度为0if (node == null) {return 0;} // 如果左右子树返回了-1 说明已经有子树不是平衡二叉树了,继续返回-1int leftHeight = getHeight(node.left);if (leftHeight == -1) return -1;int rightHeight = getHeight(node.right);if (rightHeight == -1) return -1;// 左右子树高度差大于1,return -1表示已经不是平衡树了int diff = Math.abs(leftHeight - rightHeight)if (diff > 1) return -1;// 由子节点的高度计算当前节点的高度int height = Math.max(leftHeight, rightHeight) + 1;return height;}
}

257. 二叉树的所有路径

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

难点1:要想顺序记录从根节点到叶子节点的路径,就需要从上到下访问,所以这个题只能用前序遍历。

难点2:第一次遇到回溯的题目,要懂得回溯的原理和思想。

在这里插入图片描述

class Solution {public List<String> binaryTreePaths(TreeNode root) {List<String> res = new ArrayList<>(); // 存放最终结果if (root == null) {return res;}List<Integer> path = new ArrayList<>(); // 存放最终结果中的单独一条路径traversal(root, path, res);return res;}public void traversal(TreeNode node, List<Integer> path, List<String> res) {path.add(node.val); //前序遍历,先加入中间节点if (node.left == null && node.right == null) { // 如果当前这个节点就是一个叶子节点,就把当前这条路径加入res中StringBuilder sb = new StringBuilder(); //StringBuilder拼接更方便for (int i = 0; i < path.size() - 1; i++) {sb.append(path.get(i)); // 这里不是sb.add,是appendsb.append("->");}sb.append(path.get(path.size() - 1)); //最后一个节点后面没有"->",所以单独处理res.add(sb.toString()); //收集这个路径return; //到这个节点就停了,后面不需要处理了,可以退出了,这里没有删除当前path的最后一个节点值的原因是,当前函数结束后,会在它的上个递归里删除}// 递归和回溯是同时进行,所以要放在同一个花括号里if (node.left != null) { //如果左节点不为空,把左节点送去继续递归traversal(node.left, path, res);path.remove(path.size() - 1); //!!!回溯,这一步是最难理解的,这一句代表着,把path中的路径再回退一步,回退这一步永远是站在当前节点,去取回当前节点的左或右节点,就好像往筒里放乒乓球,放进去了要拿出来}if (node.right != null) {traversal(node.right, path, res);path.remove(path.size() - 1);}}
}

其实不用回溯也能做(或许是回溯了,但是回溯得不明显,递归一定伴随着回溯)(回溯可以理解为从某一节点出发然后又回到该节点),来看下力扣精选的题解代码:

// 每个节点访问的时候先把他存储起来,到叶子结点的时候再添加到集合中,最后返回集合的值public List<String> binaryTreePaths(TreeNode root) {List<String> res = new ArrayList<>();dfs(root, "", res);return res;}private void dfs(TreeNode root, String path, List<String> res) {//如果为空,直接返回if (root == null)return;//如果是叶子节点,说明找到了一条路径,把它加入到res中if (root.left == null && root.right == null) {res.add(path + root.val);return;}//如果不是叶子节点,在分别遍历他的左右子节点dfs(root.left, path + root.val + "->", res);dfs(root.right, path + root.val + "->", res);}作者:数据结构和算法
链接:https://leetcode.cn/problems/binary-tree-paths/solutions/400434/257-er-cha-shu-de-suo-you-lu-jing-tu-wen-jie-xi-by/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

404. 左叶子之和

简单
给定二叉树的根节点 root ,返回所有左叶子之和。

难点:左叶子之和一定是等于左子树的左叶子之和加上右子树的左叶子之和的。这是这里能用递归的根本逻辑。

递归:当遇到左叶子节点的时候,记录数值,然后通过递归求取左子树左叶子之和,和 右子树左叶子之和,相加便是整个树的左叶子之和。
层次:这个题层次遍历法也能做,因为层次遍历能访问到所有的节点,对所有的节点都判断一次: if (node->left != NULL && node->left->left == NULL && node->left->right == NULL) 然后加上值就行,也不复杂。
这里我们写一下递归法:
建议多默写几遍这个题的递归法,我觉得有好处

class Solution {public int sumOfLeftLeaves(TreeNode root) {return postOrder(root);}public int postOrder(TreeNode node) {if (node == null) {return 0;}int sumLeft;int sumRight;// 如果当前节点的左节点就是一个叶子节点,那么记录下它的值if (node.left != null && node.left.left == null && node.left.right == null) {sumLeft = node.left.val;} else {// 如果当前节点的左节点不是一个叶子节点(要么是空节点,要么下面还有很多节点),那么就继续递归sumLeft = postOrder(node.left);}// 右节点也放入递归计算它的左叶子sumRight = postOrder(node.right);return sumLeft + sumRight;}
}

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

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

相关文章

(2023版)斯坦福CS231n学习笔记:DL与CV教程 (3) | 正则化与最优化

前言 &#x1f4da; 笔记专栏&#xff1a;斯坦福CS231N&#xff1a;面向视觉识别的卷积神经网络&#xff08;23&#xff09;&#x1f517; 课程链接&#xff1a;https://www.bilibili.com/video/BV1xV411R7i5&#x1f4bb; CS231n: 深度学习计算机视觉&#xff08;2017&#xf…

智能代码:生成式 AI 在软件开发中的革命性角色

想象一下&#xff0c;在智能手机革命性地改变了我们的生活之后&#xff0c;现在轮到了生成式 AI 在软件开发领域掀起风暴。你知道吗&#xff0c;如果代码能自己编写自己&#xff0c;这将是多么惊人的一步&#xff1f;这就好比我们现在能轻松地用手机应用管理日常生活一样&#…

【嘉立创EDA-PCB设计指南】1.PCB基本概念及原理图绘制

前言&#xff1a;本文详解PCB基本概念以及实现MCU最小系统原理图的绘制&#xff08;原理图包括MCU芯片GD32F103C8T6、外部晶振、输出端口、USB输入口、5v转3v3稳压输出、复位按键、唤醒按键、LED&#xff09;。为本专栏后面章节实现PCB绘制做准备。 最终绘制的原理图如下所示&…

2019年认证杯SPSSPRO杯数学建模B题(第二阶段)外星语词典全过程文档及程序

2019年认证杯SPSSPRO杯数学建模 基于统计和迭代匹配的未知语言文本片段提取模型 B题 外星语词典 原题再现&#xff1a; 我们发现了一种未知的语言&#xff0c;现只知道其文字是以 20 个字母构成的。我们已经获取了许多段由该语言写成的文本&#xff0c;但每段文本只是由字母…

使用Go语言的HTTP客户端和服务器

使用Go语言进行HTTP客户端和服务器开发是一种高效且强大的方式。Go语言的标准库提供了对HTTP协议的全面支持&#xff0c;使得创建HTTP客户端和服务器变得简单。 首先&#xff0c;让我们来看一下如何创建一个简单的HTTP服务器。在Go中&#xff0c;可以使用net/http包来创建HTTP…

HNU-计算机网络-实验5(自选)-安全相关编程实验

计算机网络 课程综合实验安全相关编程实验&#xff08;RUST&#xff09; 计科210X 甘晴void 202108010XXX 【前言】 这个《课程综合实验》是21级开始新加的实验&#xff0c;之前都没有。具体的可以看实验指导书&#xff0c;是用的19级同学的毕设。我完成的这个实验需要一点点R…

left join NULL踩坑

1、背景 因为最近响应监管&#xff0c;做数据全面匿名化的需求。会在写入数据库时&#xff0c;把姓名身份证做MD5处理后&#xff0c;只保留32位的前30位&#xff0c;保证即使拿到处理后的数据&#xff0c;也无法复原&#xff0c;恢复到源数据。 相应的&#xff0c;大数据BDP …

java-方法-动动小手指给个一键三连吧❤️✨

文章目录 1.概念2.静态方法和非静态方法2.1静态方法2.2非静态方法 3 参数传递方式4.方法的重载5.命令行传参6.可变参数7.递归作业 1.概念 在面向对象编程中&#xff0c;方法&#xff08;Method&#xff09;是类或对象中用于执行特定任务的一段代码。方法可以访问和操作对象的属…

layabox_2d游戏A*寻路实践

使用工具 Red Blob Games 效果 项目地址 LayaAStar2D: Laya2.0引擎2D游戏使用AStar实践。

深入理解 Flink(八)Flink Task 部署初始化和启动详解

JobMaster 部署 Task 核心入口&#xff1a; JobMaster.onStart();部署 Task 链条&#xff1a;JobMaster --> DefaultScheduler --> SchedulingStrategy --> ExecutionVertex --> Execution --> RPC请求 --> TaskExecutor TaskExecutor 处理 JobMaster 的 …

Few-shot Learning:知识点

目标&#xff1a; 让机器自己学会学习&#xff0c;学会理解和判断事物的异同&#xff08;如&#xff0c;区分两张图片内是相同的东西还是不同的东西&#xff0c;不是识别出是什么东西&#xff09; Pretraining 前景知识 C o s i n e S i m i l a r i t y Cosine \ Similarity…

❤ Uniapp使用二 ( 日常使用篇)

❤ Uniapp使用二 ( 日常使用篇) 一、表单 1、基础表单验证 form <form submit"formSubmit" reset"formReset"> <view class"uni-form-item uni-column"><view class"title">请选择类型{{selectvalue}}</view&…

Go语言中的HTTP请求发送

在Go语言中&#xff0c;发送HTTP请求是一种常见的网络操作。Go语言的net/http包提供了强大的API&#xff0c;使开发者能够轻松地构建HTTP请求并处理响应。 下面我们将详细介绍如何使用Go语言发送HTTP请求&#xff0c;包括设置请求参数、处理响应状态码和头部信息、发送JSON数据…

2024年,如何更好地守护智能网联汽车出海网络安全与隐私安全?

近年来全球各国陆续出台了很多网络安全与数据合规相关的法律法规&#xff0c;如欧盟的《通用数据保护准则GDPR》、美国的《加州消费者信息保护法CCPA》、新加坡的《隐私数据保护法PDPA》等。在国内全国人大发布了《网络安全法》、《数据安全法》、《个人信息保护法》法律&#…

poi解析word取参数方法${参数名}获取参数异常处理(2024-01-12)

poi 读取word模板&#xff0c;确保 ${参数名} 在一个XWPFRun XWPFDocument读取word模板&#xff0c;经常遇到 ${参数名} 没有被识别在一个XWPFRun中&#xff0c;导致参数解析异常如法实现参数替换。 这里只是介绍word模板参数解析问题&#xff0c;让word格式如何转换为可以正常…

【MATLAB随笔】遗传算法优化的BP神经网络(随笔,不是很详细)

文章目录 一、算法思想1.1 BP神经网络1.2 遗传算法1.3 遗传算法优化的BP神经网络 二、代码解读2.1 数据预处理2.2 GABP2.3 部分函数说明 一、算法思想 1.1 BP神经网络 BP神经网络&#xff08;Backpropagation Neural Network&#xff0c;反向传播神经网络&#xff09;是一种监…

解析HTTP响应的JSON数据

解析HTTP响应的JSON数据是许多Web开发任务中的常见需求。在Go语言中&#xff0c;可以使用标准库中的encoding/json包来轻松解析JSON数据。下面我将详细介绍如何解析HTTP响应的JSON数据。 首先&#xff0c;确保你已经发送了一个HTTP请求并获取到了响应。然后&#xff0c;你可以…

智能管理护航制造企业安全生产:信息化升级解决方案解析-亿发

安全生产信息化是通过充分利用信息技术&#xff0c;及时采集安全生产管理中的各种要素和数据&#xff0c;并进行统计分析&#xff0c;随后将分析结果及时反馈&#xff0c;以实现对安全生产管理的指导和帮助&#xff0c;旨在提高安全生产管理的效能。 在提升安全生产管理水平方…

达摩研究院Paraformer语音识别-中文-通用-16k

原文&#xff1a;https://github.com/alibaba-damo-academy/FunASR/blob/main/runtime/readme_cn.md FunASR软件包路线图 English Version&#xff08;docs&#xff09; FunASR是由阿里巴巴通义实验室语音团队开源的一款语音识别基础框架&#xff0c;集成了语音端点检测、语…

AI编程可视化Java项目拆解第二弹,AI辅助生成方法流程图

之前分享过一篇使用 AI 可视化 Java 项目的文章&#xff0c;同步在 AI 破局星球、知乎、掘金等地方都分享了。 原文在这里AI 编程&#xff1a;可视化 Java 项目 有很多人感兴趣&#xff0c;我打算写一个系列文章拆解这个项目&#xff0c;大家多多点赞支持~ 今天分享的是第二…