Day17|二叉树part04:110.平衡二叉树、257.二叉树的所有路径、404.左叶子之和、543: 二叉树的直径、124: 二叉树的最大路径和

之前的blog链接:https://blog.csdn.net/weixin_43303286/article/details/131982632?spm=1001.2014.3001.5501

110.平衡二叉树

  • 本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。
  • 思路:递归求两个子树高度,一旦不满足平衡了,就把该节点的高度设置为-1;
  • 一旦子树中有-1,那么本身肯定不是二叉平衡树了,直接返回-1;
  • 如果还是,更新高度为Math.max(left, right) + 1;
class Solution {
    private int getHeight(TreeNode node){
        if(node == null){
            return 0;
        }
        int left = getHeight(node.left);
        if(left==-1){
            return -1;
        }
        int right = getHeight(node.right);
        if(right == -1){
            return -1;
        }
        if(Math.abs(left - right) > 1){
            return -1;
        }
        return Math.max(left, right) + 1;


    }
    public boolean isBalanced(TreeNode root) {
        if(root == null){
            return true;
        }

        return getHeight(root) != -1;
    }
}
  • 二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数。
  • 二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数。

但leetcode中强调的深度和高度很明显是按照节点来计算的,如图:

image

(高度:从下往上,深度:从上往下)

关于根节点的深度究竟是1 还是 0,不同的地方有不一样的标准,leetcode的题目中都是以节点为一度,即根节点深度是1。但维基百科上定义用边为一度,即根节点的深度是0,我们暂时以leetcode为准(毕竟要在这上面刷题)。

257.二叉树的所有路径

class Solution {
    private List<String> res = new ArrayList<>();
    private StringBuilder sb = new StringBuilder();
    private void traversal(TreeNode node){
        if(node == null){
            return;
        }
        int length = sb.length();
        sb.append(node.val);
        if(node.left == null && node.right == null){
            res.add(sb.toString());
        }
        sb.append("->");
        traversal(node.left);
        traversal(node.right);
        sb.setLength(length);
    }
    public List<String> binaryTreePaths(TreeNode root) {
        traversal(root);
        return res;
    }
}
  • java中String无法修改,于是提供了StringBuffer进行字符串的相关操作,使用toString()方法转化为String;
  • 这里需要回溯,回溯的方法就是恢复sb到原来的length:

你需要在每次递归调用前后,分别添加和删除当前节点的值,以保证 StringBuilder 对象 sb 在每次递归返回后都能恢复到调用前的状态。这种技术被称为回溯。

  • 终止条件应该是node==null:

如果我们选择的终止条件是节点是叶子节点,那么在遍历到叶子节点时,我们还会尝试去遍历它的左子节点和右子节点,这将导致我们尝试去访问 null 节点的左右子节点,从而可能出现空指针异常

  • 记得添加箭头的位置。

404.左叶子之和

class Solution {
    private int res = 0;

    private void traversal(TreeNode node){
        if(node == null){
            return;
        }
        if(node.left != null && node.left.left == null && node.left.right == null){
            res += node.left.val;
        }
        traversal(node.left);
        traversal(node.right);
    }
    public int sumOfLeftLeaves(TreeNode root) {
        traversal(root);
        return res;
    }
}
  • 关键是这么判断左叶子:从父节点出发,判断父节点的左节点是否是叶子结点。

543. 二叉树的直径

class Solution {
    private int ans = 0;
    private int traversal(TreeNode node){
        if(node == null){
            return 0;
        }
        int L = traversal(node.left);
        int R = traversal(node.right);
        ans = Math.max(L + R + 1, ans);
        return Math.max(L, R) + 1;
    }
    public int diameterOfBinaryTree(TreeNode root) {
        traversal(root);
        return ans - 1;
    }
}
  • 这里为什么ans要 - 1:

ans 是所有节点的左子树深度与右子树深度之和的最大值。但是这个值实际上是节点的数量,而不是边的数量。在二叉树中,n个节点的路径长度是n-1(因为路径长度是由边来定义的,而一个路径上的边总是比节点少1)

124. 二叉树的最大路径和(Hard)

class Solution {
    int maxSum = Integer.MIN_VALUE;

    public int maxPathSum(TreeNode root) {
        maxGain(root);
        return maxSum;
    }

    public int maxGain(TreeNode node) {
        if (node == null) {
            return 0;
        }

        // 递归计算左右子节点的最大贡献值
        // 只有在最大贡献值大于 0 时,才会选取对应子节点
        int leftGain = Math.max(maxGain(node.left), 0);
        int rightGain = Math.max(maxGain(node.right), 0);

        // 节点的最大路径和取决于该节点的值与该节点的左右子节点的最大贡献值
        int priceNewpath = node.val + leftGain + rightGain;

        // 更新答案
        maxSum = Math.max(maxSum, priceNewpath);

        // 返回节点的最大贡献值
        return node.val + Math.max(leftGain, rightGain);
    }
}
  • 不是很理解,自己的代码和他的差不多,就是过不了。
  • 跟直径那题思路基本一样,就是要考虑负数。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【氮化镓】利用Ga2O3缓冲层改善SiC衬底AlN/GaN/AlGaN HEMT器件性能

Micro and Nanostructures 189 (2024) 207815文献于阅读总结。 本文是关于使用SiC衬底AlN/GaN/AlGaN高电子迁移率晶体管&#xff08;HEMT&#xff09;的研究&#xff0c;特别是探讨了不同缓冲层对器件性能的影响&#xff0c;以应用于高速射频&#xff08;RF&#xff09;应用。…

网络抓包原理及常用抓包工具

本文以App作为例子&#xff0c;实际应用不限于App范围。 定位网络接口问题分析其他App数据接口学习网络协议&#xff0c;使用抓包工具分析网络数据更直观 大部分场合都可以通过程序调试来定位问题&#xff0c;但有些场景使用抓包来定位接口问题更准确、更方便&#xff0c;如以…

手机网页关键词视频爬虫采集软件可导出视频分享链接|视频无水印批量下载工具

全新音视频批量下载工具&#xff0c;为您解放视频管理烦恼&#xff01; 现如今&#xff0c;音上涌现出大量精彩的视频内容&#xff0c;但是要想高效地获取、管理和分享这些视频却是一件颇具挑战的事情。针对这一难题&#xff0c;我们自主研发了全新的音视频批量下载工具&#x…

云计算系统等保测评对象和指标选取

1、云计算服务模式与控制范围关系 参考GBT22239-2019《基本要求》附录D 云计算应用场景说明。简要理解下图&#xff0c;主要是云计算系统安全保护责任分担原则和云服务模式适用性原则&#xff0c;指导后续的测评对象和指标选取。 2、测评对象选择 测评对象 IaaS模式 PaaS模式…

微信投票小程序源码系统:礼物道具投票盈利能力超强 带完整的安装代码包以及安装部署教程

近年来&#xff0c;微信小程序以其便捷性、轻量化等特点&#xff0c;迅速占据了移动应用市场的一席之地。投票小程序作为其中的一种应用类型&#xff0c;因其独特的互动性和社交性&#xff0c;成为了商家进行品牌宣传、活动推广的有力工具。然而&#xff0c;市场上的投票小程序…

离谱!奇安信人事总监透露:Web安全不会岗位这些就别投简历了

有人的地方就有江湖&#xff0c;有互联网安全的地方&#xff0c;就必然有Web安全工程师的身影。但其实Web安全是近几年才备受关注的&#xff0c;从事这方面的专业人员并不多&#xff0c;这就导致整个市场Web安全研究员的供求严重不平衡。 这种供求不平衡直接反映在Web安全研究…

常纪文-污水处理的绿色低碳政策与市场机遇

报告人&#xff1a;常纪文 报告题目&#xff1a;污水处理的绿色低碳政策与市场机遇 大会专家 常纪文&#xff0c;国务院发展研究中心资源与环境政策研究所副所长、研究员&#xff0c;国家碳达峰碳中和标准化总体组成员、中国环境科学学会常务理事、生态环境部环境影响评价委员…

复旦大学MBA:iLab项目探寻科技创新 助力企业出海

2024年2月底&#xff0c;新一轮复旦MBA iLab商业咨询项目&#xff08;以下简称iLab项目&#xff09;正式拉开序幕。      科创大时代&#xff0c;如何于变局中创新突破、绘就商业“蓝图”&#xff1f;怎样把握ESG投资机遇&#xff0c;创造可持续发展的未来&#xff1f;如何…

Java反射机制的讲解及其示例说明

Java 反射机制是指在运行时动态地获取类的信息以及操作对象的方式。它允许程序在运行时检查和操作类、方法、属性等&#xff0c;而不需要在编译时就确定这些属性。通过反射机制&#xff0c;我们可以在运行时动态地创建对象、调用方法、获取属性等。 Java 反射机制提供了以下主…

企业数据指标体系构建的四大原则

在信息化和数字化的时代浪潮下&#xff0c;数据已成为企业决策的重要依据。数据指标体系作为企业管理数据的基石&#xff0c;对于提升企业运营效率、优化资源配置、实现战略目标具有重要意义。因此&#xff0c;构建一套科学、合理的企业数据指标体系成为企业的迫切需求。本文将…

代码签名证书被吊销的原因及其后果是什么?

代码签名证书是确保软件代码完整性和可信度的关键工具&#xff0c;然而&#xff0c;在某些情况下&#xff0c;此类证书可能会被撤销。这意味着证书颁发机构&#xff08;CA&#xff09;不再认可该证书的有效性&#xff0c;并宣布其失效。本文将解析导致代码签名证书撤销的原因、…

基于springboot的大创管理系统

采用技术 基于springboot的大创管理系统的设计与实现~ 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBootMyBatis 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 页面展示效果 管理员模块 项目中检管理 专家评审管理 指导老师模块 项目申…

【Java开发过程中的流程图】

流程图由一系列的图形符号和箭头组成&#xff0c;每个符号代表一个特定的操作或决策。下面是一些常见的流程图符号及其含义&#xff1a; 开始/结束符号&#xff08;圆形&#xff09;&#xff1a;表示程序的开始和结束点。 过程/操作符号&#xff08;矩形&#xff09;&#xff…

Prometheus mysqld_exporter 监控mysql配置方法

Prometheus mysqld_exporter 支持MySQL服务的监控指标 支持的版本&#xff1a; MySQL > 5.6.MariaDB > 10.3 一、首先 在配置mysqld_exporter监控之前&#xff0c;我们需要先创建一个监控帐号&#xff0c;用于后面连接数据库使用 CREATE USER exporterlocalhost IDE…

Elasticsearch数据写入、检索流程及底层原理全方位解析

码到三十五 &#xff1a; 个人主页 心中有诗画&#xff0c;指尖舞代码&#xff0c;目光览世界&#xff0c;步履越千山&#xff0c;人间尽值得 ! 目录 ✍&#x1f3fb;序言✍&#x1f3fb;1️⃣✍&#x1f3fb;es的架构简介1. 分布式架构2. 索引与搜索3. 数据写入与持久化4. 缓…

TSINGSEE青犀数字化、智能化视频技术推动森林防火智慧监管

一、背景分析 中央网络安全和信息化委员会印发《“十四五”国家信息化规划》&#xff0c;明确指出“提升林草生态网络感知能力&#xff0c;完善生态系统保护成效数字化监测评估体系”。这为数字化系统建设引领了方向&#xff0c;中国林业信息化建设迈入了新的阶段&#xff0c;全…

Unity多人游戏基础知识总结

作者简介: 高科,先后在 IBM PlatformComputing从事网格计算,淘米网,网易从事游戏服务器开发,拥有丰富的C++,go等语言开发经验,mysql,mongo,redis等数据库,设计模式和网络库开发经验,对战棋类,回合制,moba类页游,手游有丰富的架构设计和开发经验。 (谢谢你的关注…

【机器学习】机器学习实验方法与原则(评价指标全面解析)

评价指标 在 不同任务 下衡量模型的性能&#xff0c;有 不同的评价指标 &#xff0c;例如&#xff1a; • 回归任务 • 平均绝对误差&#xff08; MAE &#xff09;、均方误差&#xff08; MSE &#xff09;、均方根误差&#xff08; RMSE &#xff09;等 • 分类任务 •…

数据本地性如何助力企业在云上实现高效机器学习

分享嘉宾&#xff1a; Lu Qiu, Shawn Sun 本文将讨论数据本地性对于在云上进行高效机器学习的重要性。首先对比现有解决方案的利弊&#xff0c;并综合考虑如何通过数据本地性来降低成本和实现性能最大化。其次会介绍新一代的Alluxio设计与实现&#xff0c;详细说明其在模型训练…

语言与人生:编程中的“影视风云”

语言与人生&#xff1a;编程中的“影视风云” Language and Life: The “Cinematic Spectacle” in Programming 编程&#xff0c;于我而言&#xff0c;便如走进一座座影视城&#xff0c;每换一种语言&#xff0c;便仿佛遇见了一位新的影视人物&#xff0c;性格迥异&#xff0c…