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

news2024/9/19 11:05:57

之前的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);
    }
}
  • 不是很理解,自己的代码和他的差不多,就是过不了。
  • 跟直径那题思路基本一样,就是要考虑负数。

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

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

相关文章

Matlab之已知2点绘制长度可定义的射线

目的&#xff1a;在笛卡尔坐标系中&#xff0c;已知两个点的位置&#xff0c;绘制过这两点的射线。同时射线的长度可以自定义。 一、函数的参数说明 输入参数&#xff1a; PointA&#xff1a;射线的起点&#xff1b; PointB&#xff1a;射线过的零一点&#xff1b; Length&…

AI PPT生成工具 V1.0.0

AI PPT是一款高效快速的PPT生成工具&#xff0c;能够一键生成符合相关主题的PPT文件&#xff0c;大大提高工作效率。生成的PPT内容专业、细致、实用。 软件特点 免费无广告&#xff0c;简单易用&#xff0c;快速高效&#xff0c;提高工作效率 一键生成相关主题的标题、大纲、…

【链表】Leetcode 138. 随机链表的复制【中等】

随机链表的复制 给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff0c;该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成&#xff0c;其中每个新节点的值都设为其对应的原节点…

Linux - 应用层HTTPS、传输层TCP/IP模型中典型协议解析

目录 应用层&#xff1a;自定制协议实例 HTTP协议首行头部空行正文http服务器的搭建 HTTPS协议 传输层UDP协议TCP协议 应用层&#xff1a; 应用层负责应用程序之间的沟通—程序员自己定义数据的组织格式 应用层协议&#xff1a;如何将多个数据对象组织成为一个二进制数据串进行…

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

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

Bytebase 2.14.1 - 分支 (Branching) 功能支持 Oracle

&#x1f680; 新功能 分支 (Branching) 功能支持 Oracle。为 SQL 编辑器添加了项目选择器。 新增 SQL 审核规范&#xff1a; 禁止混合 DDL、DML 语句。禁止对同一张表进行不同类型的 DML 变更 (UPDATE,INSERT,DELETE)。 &#x1f514; 重大变更 工作空间设置中的「数据访问…

puppeteer使用示例云顶之弈官网

自己从0到1开发的&#xff0c;微信小程序【云顶宝藏】求求点个5星好评吧&#xff01; 需求&#xff1a;拿到所有英雄的信息 思路&#xff1a;点击每个英雄&#xff0c;进入英雄详情页&#xff0c;拿信息&#xff0c;并返回&#xff0c;继续下一个英雄** 最终效果 本地环境 win…

【链表】Leetcode 148. 排序链表【中等】

排序链表 给你链表的头结点 head &#xff0c;请将其按 升序 排列并返回 排序后的链表 。 示例 1&#xff1a; 输入&#xff1a;head [4,2,1,3] 输出&#xff1a;[1,2,3,4] 解题思路 对链表进行升序排序&#xff0c;可以使用归并排序&#xff08;Merge Sort&#xff09;的…

vben admin上线后接口调用成功,控制台报promise错误

vben admin上线后接口调用成功&#xff0c;控制台报promise错误 问题原因 vben admin框架对返回的数据格式做了统一处理&#xff0c;不满足格式要求的接口返回直接抛异常。 解决方案 将返回参数校验关闭&#xff0c;重新打包部署。

windowsVMware虚拟机中扩展linux磁盘空间

1.虚拟磁盘扩容 VM中&#xff0c;关闭linux虚拟机&#xff0c;直接编辑虚拟机-硬盘-扩展磁盘容量 2.通过Gparted工具进行LINUX系统磁盘分区 未分区挂载前可以看到/挂载点下空间为20G&#xff1a; 通过虚拟机-快照-拍摄快照&#xff0c;操作前可拍摄快照&#xff08;便于恢复之前…

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

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

酷开科技以内容技术服务和数字营销服务为核心,自主研发酷开系统

家庭场景的需求&#xff0c;才是大屏电视的目的。屏幕越大得到的画幕越大&#xff0c;消费者也就看的越清楚&#xff0c;从而获得更好的观看体验&#xff0c;尤其是家里有老人孩子的&#xff0c;为了得到更好的视觉效果&#xff0c;使得消费者对于大屏的需求也在增加。酷开系统…

动脉自旋标记(ASL):临床应用及解读

导读 动脉自旋标记(Arterial spin labeling&#xff0c;ASL)是一种磁共振灌注成像技术&#xff0c;可以在不使用静脉钆造影剂的情况下量化脑血流量(CBF)。了解ASL的技术基础和灌注的生理变化对于识别正常变异和伪影很重要。灌注的病理变化见于多种疾病&#xff0c;包括急慢性缺…

【漏洞复现】云时空ERP Public接口处RCE漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

Altman专访自曝全新GPT-5细节:性能跃升超想象,算力足可达AGI!

&#x1f600;前言 在人工智能领域&#xff0c;OpenAI的最新一代模型GPT-5备受期待。其性能提升被认为将创造历史&#xff0c;并有潜力成为推动文明发展的核心动力。Altman作为OpenAI的领导人之一&#xff0c;在一系列访谈中透露了关于GPT-5和人工智能未来的深刻见解&#xff0…

低代码无法取代程序员,但为什么很多程序员却反感低代码?

引言 在当今快节奏的软件开发领域&#xff0c;低代码开发平台正日益受到关注并广泛应用。低代码开发通过可视化建模和自动化工具&#xff0c;使得非专业开发者和业务人员能够更快速地创建应用程序&#xff0c;从而大大加快了软件交付的速度。这种新兴的开发方式已经在许多行业…

Linux下QT界面小程序开发

背景&#xff1a;需要在linux不同环境下可以测试我们的读卡器设备 搭建本地linux开发环境&#xff08;本来想VS里开发然后通过SSH的方式在linux下编译&#xff0c;但是工具链一直没搞起来&#xff0c;所以我是在ubuntu里安装的QT Creator工具直接开发的&#xff09;&#xff1b…

基于Java中的SSM框架实现高校毕业设计管理系统项目【项目源码+论文说明】

基于Java中的SSM框架实现高校毕业设计管理系统演示 摘要 现代学校的教学规模逐渐增加&#xff0c;需要处理的信息量也在增加。每年毕业&#xff0c;将会有大量的毕业设计要处理。传统的毕业设计管理方法已不能满足师生的需求。教师和学生需要一个简单方便的系统来取代传统的机…

WebGIS管线在线编辑器(电力、水力、燃气、热力、热能管线)

随着GIS等信息技术的发展&#xff0c;地下管线管理也从二维平面向三维立体管理迈进。传统管线信息管理系统将管线及其附属设施抽象成二维平面内的点、要素&#xff0c;并使用各类点符号、不同颜色线段进行表达。虽能一定程度上满足城市智慧运行的需要&#xff0c;但不能很直观的…

FMEA助力新能源汽车行业腾飞:安全、效率双提升

随着新能源汽车市场的迅猛发展&#xff0c;各大车企纷纷加大研发力度&#xff0c;力求在激烈的市场竞争中脱颖而出。其中&#xff0c;FMEA&#xff08;故障模式与影响分析&#xff09;作为一种先进的质量管理工具&#xff0c;正被越来越多地应用于新能源汽车的研发和生产过程中…