力扣543. 二叉树的直径(java DFS解法)

Problem: 543. 二叉树的直径

文章目录

  • 题目描述
  • 思路
  • 解题方法
  • 复杂度
  • Code

题目描述

给你一棵二叉树的根节点,返回该树的 直径 。
二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。
两节点之间路径的 长度 由它们之间边数表示。
在这里插入图片描述在这里插入图片描述

思路

本题目要求我们求取二叉树中最长的路径,可将其按递归的思想分解成的最小子问题如下:

1.求取左子树的最长路径
2.求取右子树的最长路径
3.合并求取树的最长路径

解题方法

1.定义成员变量result记录最长“直径”
2.编写递归代码,依次得到左右子树的最长“直径”
3.将左右子树的最长“直径”合并得到当前的最长“直径”,并与result比较更新
4.在归的过程中返回当前左右子树的最长路径加一(因为此时要回退到上一个节点,所以要加一!!!)

复杂度

时间复杂度:

O ( n ) O(n) O(n)

空间复杂度:

O ( h ) O(h) O(h) h h h为树的高度

Code

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    //Recode the longest diameter
    private int result = 0;

    /**
     * Gets the path length between any two nodes of a tree
     *
     * @param root The root node of a tree
     * @return int
     */
    public int diameterOfBinaryTree(TreeNode root) {
        claMaxHeight(root);
        return result;
    }

    /**
     * Recursively gets the longest path containing the root node
     *
     * @param root The root node of a tree
     * @return int
     */
    public int claMaxHeight(TreeNode root) {
        if (root == null) {
            return 0;
        }
        //Gets the longest path of the left and right subtree
        int maxLeftHeight = claMaxHeight(root.left);
        int maxRightHeight = claMaxHeight(root.right);
        //Get the longest path("diameter")
        int diameter = maxLeftHeight + maxRightHeight;
        //Update the longest path("diameter")
        if (diameter > result) {
            result = diameter;
        }
        return Math.max(maxLeftHeight, maxRightHeight) + 1;
    }
}

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

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

相关文章

Python----练习:使用面向对象实现报名系统开发

第一步:分析哪些动作是由哪些实体发出的 学生提出报名 学生提供相关资料 学生缴费 机构收费 教师分配教室 班级增加学生信息 于是,在整个过程中,一共有四个实体:学生、机构、教师、班级!在现实中的一个具体的实…

Kali Linux三种网络攻击方法总结(DDoS、CC和ARP欺骗)

本文章使用的是Kali Linux的2020-4-installer-amd64版本 Kali Linux的安装过程本文章不做过多说明,请自行百度 请正确使用DDos和CC攻击,不要用来做违反当地法律法规的事情,否则后果自负 CSDN大礼包:《黑客&网络安全入门&am…

使用DevEco Studio时遇见的错误情况与问题

第一个 问题:打开项目文件,控制台报错 hvigor ERROR: Unable to find sdk.dir in local.properties or OHOS_BASE_SDK_HOME in the system environment path. 解决办法:在项目根目录中打开local.properties。如果没有local.properties,自己创建。 在local.properties中填…

tNavigator 23.2 x64

Rock Flow Dynamics(RFD)很高兴地宣布发布我们旗舰产品tNavigator的最新版本。版本 23.2 现在可供用户使用。 tNavigator长期以来一直被认为是油藏工程师和地质学家的强大工具,可为复杂的油藏行为提供准确的建模和模拟。最新版本为所有模块带…

numpy知识库:基于numpy绘制灰度直方图

前言 对于灰度图像而言,灰度直方图可以统计灰度图像内各个灰度级出现的次数。 灰度直方图的横坐标是灰度图像中各像素点的灰度级。灰度的数值范围为[0, 255]。因此,如果将图像分为256个灰度级,那么每个灰度级唯一对应一个灰度;如…

【JVM系列】Class文件分析

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

GPU深度学习性能的三驾马车:Tensor Core、内存带宽与内存层次结构

编者按:近年来,深度学习应用日益广泛,其需求也在快速增长。那么,我们该如何选择合适的 GPU 来获得最优的训练和推理性能呢? 今天,我们为大家带来的这篇文章,作者的核心观点是:Tensor…

CRM实战:如何对商机阶段进行有效管理

对企业来说,管理客户的多个需求对于开发新的商机至关重要。一旦发现客户有多个需求,我们可以在客户信息表中建立相应数量的商机,这样有助于系统化地进行跟进,达到商机利用的最大化。那么,CRM系统如何进行企业的商机阶段…

D盘被格式化了如何恢复数据?正确操作!(4个方法)

“由于d盘空间太满了,我前段时间清理电脑时对其进行了格式化操作,所有的数据都被删除了。但我突然想起有些很重要的数据也被烧了,可怎么办呢?有什么解决方法吗?” D盘作为电脑中重要的磁盘之一,很多用户都会…

信息泄露威胁:日本科技巨头遭网络攻击,超40万条数据悬崖边缘!

11月27日下午,日本最主要通讯应用程序Line的运营商、日本LY公司发布公告称,有攻击者通过附属公司的NAVER Cloud系统访问了其内部服务器,可能泄露了数十万条包含用户、员工和业务合作伙伴在内的数据。 这一数据泄露事件发生在10月9日&#xff…

网工学习9-STP配置(二)

如图 1 所示,当前网络中存在环路, SwitchA 、SwitchB 、SwitchC 和 SwitchD 都运行 STP,通过 彼此交互信息发现网络中的环路,并有选择的对某个端口进行阻塞,最终将环形网络结构修剪成无 环路的树形网络结构&#xff…

钉钉提交审批意见,并上传附件接口集成

一:适配器 DingtalkApprovalFilesExecute 参考方案链接:轻易云数据集成平台 二:请求接口。配置参数 接口文档:使用了新旧接口 服务端API发起带有附件的审批流并下载附件 - 钉钉开放平台 接口:topapi/processinsta…

Pytorch深度强化学习1-5:详解蒙特卡洛强化学习原理

目录 0 专栏介绍1 蒙特卡洛强化学习2 策略评估原理3 策略改进原理3.1 同轨蒙特卡洛强化学习3.2 离轨蒙特卡洛强化学习 0 专栏介绍 本专栏重点介绍强化学习技术的数学原理,并且采用Pytorch框架对常见的强化学习算法、案例进行实现,帮助读者理解并快速上手…

Hdoop学习笔记(HDP)-Part.18 安装Flink

目录 Part.01 关于HDP Part.02 核心组件原理 Part.03 资源规划 Part.04 基础环境配置 Part.05 Yum源配置 Part.06 安装OracleJDK Part.07 安装MySQL Part.08 部署Ambari集群 Part.09 安装OpenLDAP Part.10 创建集群 Part.11 安装Kerberos Part.12 安装HDFS Part.13 安装Ranger …

⾃定义类型:联合和枚举(C语言版)

一.联合体. 1.1.联合体类型的声明,定义 像结构体⼀样,联合体也是由⼀个或者多个成员构成,这些成员可以不同的类型,但是编译器只为最⼤的成员分配⾜够的内存空间。联合体的特点是 所有成员共⽤同⼀块内存空间 。所以联合体也叫:共⽤体。 给联…

TextCNN文本分类快速上手

这里写目录标题 TextCNN介绍:Docker从0安装Docker基于镜像安装容器打包操作(生成镜像时使用的命令)安装时命令 页面访问模型训练API访问性能测试其他查看显卡信息 TextCNN介绍: 1.支持语义识别和分类置信度输出。 2.训练速度快&…

10倍提升启动的时间?Graalvm打包Springboot+MyBatis实测

graalvm使用前后对比图 相关代码博客:https://blog.csdn.net/weixin_43914278/article/details/134446327 工具大小时间graalvm打包的exe文件84.14MB0.251秒graalvm打包的docker文件121.27MB0.253秒jar包51.34MB2.153秒 解析 文件大小: graalvm打包的Docker文件…

如何提高WhatsApp回复率,附相关进阶技巧

现在WhatsApp开发客户基本上也是成为了很多外贸人的共识了,基本上大部分的外贸朋友都有在用。但是用多了就会发现,虽然WhatsApp的回复率是比较高的,但是很多都是礼貌性回复,真正进行营销的时候,其实客户还是很多不会回…

scikit-learn线性回归法进行利润预测

大家好,生成式人工智能无疑是一个改变游戏规则的技术,但对于大多数商业问题来说,回归和分类等传统的机器学习模型仍然是首选。 私募股权或风险投资这样的投资者利用机器学习,首先必须了解关注的数据以及它是如何被使用的。投资公…

TimeGPT:时间序列预测模型实例

时间序列预测领域正在经历一个非常激动人心的时期。在过去的三年里,我们见证了许多重要的贡献,如N-BEATS、N-HiTS、PatchTST和TimesNet等。同时,大型语言模型(LLM)近来在流行度方面取得了很大的成功,例如Ch…