图解LeetCode——543. 二叉树的直径

简介: 图解LeetCode——543. 二叉树的直径

一、题目

给你一棵二叉树的根节点,返回该树的 直径

二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root

两节点之间路径的 长度 由它们之间边数表示。

二、示例

2.1> 示例 1:

输入】root = [1,2,3,4,5]

输出】3

解释】3 ,取路径 [4,2,1,3] 或 [5,2,1,3] 的长度。

2.2> 示例 2:

输入】root = [1,2]

输出】1

提示:

  • 树中节点数目在范围 [1, 10^4]
  • -100 <= Node.val <= 100

三、解题思路

根据题目描述,我们要获得二叉树中任意两个节点的最大直径。那么如何确定哪两个节点是值得去进行计算的?或者那两个节点我们应该去进行计算。以一个3节点的子树为例,分为:根节点(rootNode)、左子节点(leftNode)和右子节点(rightNode),那么leftNoderootNode的距离和rootNoderightNode的距离其实没有必要参与最大直径的计算,因为leftNoderightNode的距离一定倾向是最大直径。所以,我们得出一个结论:

可能的最大直径 = leftNode到rootNode的距离 + rootNode到rightNode的距离

那么,因为二叉树也并不只有3个节点,如果节点很多的话,那么这个二叉树的层级也就会越深,那么下面我们其实如果能找到leftNode到rootNode距离的最大值(或最深路径)以及找到rootNode到rightNode距离的最大值(或最深路径),那么相加必然就是本题所要求解的最大直径了。

那么针对树形结构的解题,最常用的方式就是递归算法了,从叶子节点开始统计,一直统计到根节点,并且每次都要进行直径的计算和比较,当遍历到根节点时,最大直径也就计算出来了。

以上就是本题的解题思路,为了便于大家更加深入的理解,下面我们以输入root = [1,2,3,4,5]为例,看一下是如何进行最大直径计算的(图中省略了根节点的深度和直径的计算,大家自行脑补即可),请见下图所示:

四、代码实现

class Solution {
    int diameter = 0;
    public int diameterOfBinaryTree(TreeNode root) {
        depth(root);
        return diameter;
    }
    public int depth(TreeNode node) {
        if (node == null) return 0;
        int leftLen = depth(node.left); // node左子树最大深度
        int rightLen = depth(node.right); // node右子树最大深度
        diameter = Math.max(diameter, leftLen + rightLen); // 对比直径
        return Math.max(leftLen, rightLen) + 1; // 获得最大深度
    }
}
/**
 * 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;
 *     }
 * }
 */

今天的文章内容就这些了:

写作不易,笔者几个小时甚至数天完成的一篇文章,只愿换来您几秒钟的 点赞 & 分享

更多技术干货,欢迎大家关注公众号“爪哇缪斯” ~ \(^o^)/ ~ 「干货分享,每天更新」

相关文章
|
存储 算法
Leetcode第三题(无重复字符的最长子串)
这篇文章介绍了解决LeetCode第三题“无重复字符的最长子串”的算法,使用滑动窗口技术来找出给定字符串中最长的不含重复字符的子串,并提供了详细的代码实现和解释。
845 0
Leetcode第三题(无重复字符的最长子串)
|
算法 搜索推荐 Java
【经典算法】LeetCode 215. 数组中的第K个最大元素(Java/C/Python3实现含注释说明,Medium)
【经典算法】LeetCode 215. 数组中的第K个最大元素(Java/C/Python3实现含注释说明,Medium)
930 3
|
安全 前端开发 Java
【JVM】双亲委派机制详细解读(通俗易懂)
【JVM】双亲委派机制详细解读(通俗易懂)
1803 0
|
存储 算法
【每日挠头算法题(9)】二叉树的直径|二叉树的层序遍历
【每日挠头算法题(9)】二叉树的直径|二叉树的层序遍历
|
存储 运维 数据挖掘
革新智能驾驶数据挖掘检索效率!某国内新能源汽车未来出行领导者选择阿里云Milvus构建多模态检索引擎
在智能驾驶技术快速发展中,数据成为驱动算法进步的核心。某新能源汽车领军企业基于阿里云Milvus向量数据库构建智能驾驶数据挖掘平台,利用其高性能、可扩展的相似性检索服务,解决了大规模向量数据检索瓶颈问题,显著降低20%以上成本,缩短模型迭代周期,实现从数据采集到场景挖掘的智能化闭环,加速智能驾驶落地应用。
1482 3
革新智能驾驶数据挖掘检索效率!某国内新能源汽车未来出行领导者选择阿里云Milvus构建多模态检索引擎
|
算法 API C++
蓝桥杯历年真题分类汇总(史上最全版本,一定不要错过)
蓝桥杯历年真题分类汇总(史上最全版本,一定不要错过)
蓝桥杯历年真题分类汇总(史上最全版本,一定不要错过)
|
机器学习/深度学习 算法 搜索推荐
【LeetCode】169.多数元素(三种解法)
【LeetCode】169.多数元素(三种解法)
694 0
【LeetCode】169.多数元素(三种解法)
|
存储 Web App开发 数据采集
|
机器学习/深度学习 编解码 人工智能
90+目标跟踪算法&九大benchmark!基于判别滤波器和孪生网络的视觉目标跟踪:综述与展望(上)
视觉目标跟踪(VOT)是计算机视觉中的一个基本开放问题,任务是估计图像序列中目标的轨迹和状态。VOT具有广泛的应用,包括自动驾驶、机器人、智能视频监控、运动分析和医学成像。给定任意目标对象的初始状态,VOT中的主要挑战是学习在后续帧中搜索目标对象时使用的外观模型。近年来,由于引入了多种跟踪基准,如TrackingNet、VOT2018和GOT-10K,VOT受到了极大的关注。尽管最近取得了进展,VOT仍然是一个开放的研究问题,可能比以往任何时候都更加活跃。
90+目标跟踪算法&九大benchmark!基于判别滤波器和孪生网络的视觉目标跟踪:综述与展望(上)
|
分布式计算 DataWorks 大数据
🚀DataWorks 深度实践与评测:数据治理新时代的全景体验。
在数字化转型中,企业不仅需要技术创新,更需完善的**数据管理和开发治理工具**。DataWorks 作为阿里云推出的一站式智能大数据平台,整合了阿里巴巴15年的大数据经验,提供从数据接入、开发、治理到资产管理的全流程解决方案。它支持湖仓一体架构,内置AI助手提升开发效率,并适用于金融、零售等多行业。本文将深入探讨 DataWorks 的功能、应用场景及性能表现,通过用户画像分析实践展示其强大潜力...
822 8
🚀DataWorks 深度实践与评测:数据治理新时代的全景体验。

热门文章

最新文章