二叉树或者多叉树直径问题

news2024/9/24 17:19:38

原题链接:543. 二叉树的直径 - 力扣(LeetCode)

       题目描述: 给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。

        什么是任意两点路径长的最大值呢?就是找到一条路,这条路上的节点数最多,也就是两个端点的路径最长,最长路径为节点数-1;

如下图示例1所示:

         最长路径为[4,2,1,3] 或者[5,2,1,3],每条路径有4个节点,路径长度就为3。而且起始节点和终止节点肯定是叶子(如果数有两个分叉的话,如果有一个分叉肯定是最大深度)。

如果一个树有两个分叉,如示例1,那么节点1的最子树深度为2,右子树深度为1. 总和为3。

如果树只有一个分叉,那么最大深度就是根节点到叶子节点的深度。

综上:我们只需要遍历每个节点,然后看每个节点的最子树深度+右子树深度就行了。

class Solution {
    int max = -1;
    public int diameterOfBinaryTree(TreeNode root) {
        if (root == null) {
            return 0;
        }
        dfs(root);
        return max;
    }

    private int dfs(TreeNode root) {
        if (root == null) {
            return -1;
        }
        // 左子树深度
        int left = dfs(root.left)+1;
        // 右子树深度
        int right = dfs(root.right)+1;
        // 最大值
        max = Math.max(max, left + right);
        // 返回一个根几点的最大深度。
        return Math.max(left, right) + 1;
    }
}

下图代码就是求树的最大深度。对比一下,就是少了max = Math.max(max,left + right);

 多叉树的最大直径呢?其实多叉树路径的最大值就是,top2之和,就是一个根节点的第一长子树+第二长子树。

其中x表示根节点,edges 存储的是叶子节点。

int ans = 0;
private int dfs(int x, List<Integer>[] edges) {
        int x_len = 0;
        for (int y : edges[x]) {
            int y_len = dfs(y, edges) + 1;
                ans = Math.max(ans, x_len + y_len);
                    // 前面枝的最大值。
                 x_len = Math.max(x_len, y_len);
        }
        return x_len;
    }

2246. 相邻字符不同的最长路径 - 力扣(LeetCode)可以试试这个题

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

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

相关文章

ChatGPT来了不用慌,广告人还有这个神器在手

#ChatGPT能取代广告人吗&#xff0c;#ChatGPT会抢走你的工作吗&#xff1f;#ChatGPT火了&#xff0c;会让营销人失业吗&#xff1f;自ChatGPT爆火以来&#xff0c;各种专业or非专业文章不停给广告人强加焦虑&#xff0c;但工具出现的意义&#xff0c;更多在于提效而非替代&…

BetaFlight统一硬件配置文件研读之timer命令

BetaFlight统一硬件配置文件研读之timer命令 1. 源由2. 代码分析3. 实例分析4. 配置情况4.1 AFn配置查表4.2 timer4.3 timer show4.4 timer pin list 5. 参考资料 统一硬件配置文件的设计是一种非常好的设计模式&#xff0c;可以将硬件和软件的工作进行解耦。 1. 源由 cli命令…

某程序员哀叹:二本计算机,4年开发,年包才40多万。二本真的不如985/211吗?

前段时间&#xff0c;某职场论坛上有人发了一个帖子&#xff0c;发帖人问&#xff1a;为什么大家工资那么高&#xff0c;三五年都六七十万了&#xff1f;我二本计算机专业&#xff0c;四年前端开发&#xff0c;找个年包40万多点就顶头了。 原贴如下&#xff1a; 有网友表示楼主…

【Docker】Docker上篇

文章目录 一、认识Docker1、Docker出现的背景2、Docker的历史3、虚拟机技术与容器技术4、容器比虚拟机快的原因5、对Devops层面的影响 二、Docker的安装的原理1、核心名词2、安装Docker&#xff08;for Linux&#xff09;3、配置阿里云镜像加速4、Run的流程和Docker原理 三、Do…

phoenix使用(一)之全局索引的使用

索引使用 1.1. 全局索引&#xff08;Global Indexing&#xff09; 名词解释&#xff1a; 全局索引&#xff0c;适用于读多写少的业务场景。使用Global indexing在写数据的时候开销很大&#xff0c;因为所有对数据表的更新操作&#xff08;DELETE, UPSERT VALUES and UPSERT SEL…

chatgpt软件 - chatbox

文章目录 打开github 进入chatgpt官方要记得登录&#xff01;&#xff01;点击头像将key命名&#xff1a;安装chatbox下面就可以开始使用啦&#xff01;&#xff01; 打开github https://github.com/Bin-Huang/chatbox 特性&#xff1a; 更自由、更强大的 Prompt 能力数据存储…

看了这13个案例,我总算又get到了企业级无代码

企业级无代码为何面向软件公司的研发团队&#xff1f; 哪些人能在企业级无代码旅程中获益&#xff1f; 如何找到实践的切入点&#xff1f; 如何开展规模化的交付实践&#xff1f; 如何快速组建企业级无代码开发团队&#xff1f; ...... 近期smardaten从组织创新、技术创新…

OCC的拓扑基础数据结构

在OpenCASCADE中,提供了一系列的拓扑基础数据结构,用于表示几何实体的拓扑结构,其中最基本的是TopoDS_Shape。下面是一些其他常用的拓扑数据结构: TopoDS_TCompound:代表了复合实体,即由多个几何实体组合而成的实体,可以包含任意数量和类型的其他几何实体。 TopoDS_TCom…

【消费战略方法论】认识消费者的恒常原理(三):消费者刺激反馈原理

人类是一种高度智能的生物&#xff0c;而所谓智能的核心在于其理解世界的能力&#xff0c;而理解世界的过程中必然伴随着感知和反应。人的刺激反馈机制就是在这个过程中发挥着重要的作用。 刺激反馈机制是一种生物学的反应现象&#xff0c;它指的是人体对外界刺激的感知与反应…

vue使用富文本和打印 egg使用ctx.getFileStream进行文件上传

vue2使用富文本 安装 npm install vue-quill-editor --save全局引入(main) import VueQuillEditor from vue-quill-editor//调用编辑器 // 样式 import quill/dist/quill.core.css import quill/dist/quill.snow.css import quill/dist/quill.bubble.css Vue.use(VueQuillE…

【汽车电子】浅谈LIN总线

目录 1.为何使用LIN总线 2.什么是LIN总线&#xff1f; 3.LIN总线的主从关系 4.LIN的特点 5.LIN报文帧结构 6.LIN总线波形 7.帧类型 8.进度表 9.状态机的实现 10.总结 11.声明 1.为何使用LIN总线 在这里你可能要问“不都有CAN总线了吗&#xff1f;这个LIN总线又是从哪…

【JS笔记】JS操作字符串、对象、数组、时间对象、数值操作、定时器

这篇文章&#xff0c;主要介绍JS操作字符串、对象、数组、时间对象、数值操作、定时器。 目录 一、字符串 1.1、定义字符串 1.2、字符串方法 1.3、模板字符串 1.4、JSON字符串 二、对象操作 2.1、定义对象 2.2、对象方法 三、数组操作 3.1、定义数组 3.2、数组方法 …

【Docker_windows】安装Docker桌面版

现在如果问什么行业最火&#xff0c;很多人第一反应肯定就是IT。的确&#xff0c;这些年随着互联网的不断发展&#xff0c;IT热门众所周知。那么就一起来说说&#xff0c;IT行业里&#xff0c;哪些技术更热门。 What&#xff1f; Docker Desktop&#xff1f; Docker Desktop是…

SpringBoot快速回顾(分别使用注解和xml方式去声明Bean,获取Bean)

SpringBoot快速回顾&#xff08;configuration注解&#xff09; 1. 使用xml声明Bean1.1 创建测试实体类1.2 创建xml文件&#xff08;目的&#xff1a;将实体类声明成Bean&#xff09;1.3 测试 2. 使用注解configuration声明Bean2.1 已经声明过实体类Student2.2 定义配置类2.3 测…

Lim测试平台变量使用规则介绍

一、Lim测试平台简介 Lim测试平台是一款轻量级的接口测试平台&#xff0c;也是为数不多使用python作为后端接口建设的语言。 正如它的名字我们希望在开展接口测试时能够“四两拨千斤”&#xff01;让用户操作更少但开展建设的效率更高。因此我们做了许多交互细节上的优化和创新…

Elasticsearch:人类语言到 ElasticSearch 查询 DSL

Elasticsearch 为开发者提供了强大的搜索功能。Elasticsearch 使用 DSL 来进行查询。对于很多从关系数据库过来的人&#xff0c;这个很显然不很适应。虽然我们可以使用 SQL 来进行查询&#xff0c;但是我们必须通过一些命令来进行转换。我们可以通过阅读文章&#xff1a; Elast…

SpringBoot统一功能处理(统⼀⽤户登录权限验证、统⼀异常处理、统⼀数据格式封装)

统⼀⽤户登录权限验证 1、最初的用户登录效验:在每个方法里面获取session和 session 中的用户信息&#xff0c;如果存在用户&#xff0c;那么就认为登录成功了&#xff0c;否则就登录失败了。 2、第二版用户登录效验:提供了统一的方法&#xff0c;在每个需要验证的方法中调用…

神经网络模型压缩技术—剪枝

目录 1.模型压缩定义 2.模型压缩必要性及可行性 3.模型压缩分类 3.1 主流分类 3.2 前端和后端 4.剪枝 4.1 剪枝定义 4.2 剪枝分类 4.2.1 基于粒度 4.2.2 基于是否结构化 4.2.3 基于目标 5. 结构化剪枝和非结构化剪枝 5.1 非结构化剪枝&#xff08;移除单个权重或神…

【Python习题集1】Python 语言基础知识

python习题 一、实验内容二、实验总结 一、实验内容 1、运用输入输出函数编写程序&#xff0c;将华氏温度转换成摄氏温度。换算公式&#xff1a;C(F-32)*5/9,其中C为摄氏温度&#xff0c;F为华氏温度。 &#xff08;1&#xff09;源代码&#xff1a; ffloat(input(输入华氏温…

swift 技术 监听电话中断

一直觉得自己写的不是技术&#xff0c;而是情怀&#xff0c;一个个的教程是自己这一路走来的痕迹。靠专业技能的成功是最具可复制性的&#xff0c;希望我的这条路能让你们少走弯路&#xff0c;希望我能帮你们抹去知识的蒙尘&#xff0c;希望我能帮你们理清知识的脉络&#xff0…