当前位置: 首页 > news >正文

图解LeetCode——687. 最长同值路径(难度:中等)

一、题目

给定一个二叉树的 root ,返回某个路径中的每个节点都具有相同值的 最长路径长度  。 这条路径可以经过也可以不经过根节点。

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

二、示例

2.1> 示例 1:

【输入】root = [5,4,5,1,1,5]
【输出】2
【解释】5——>5——>5

2.2> 示例 2:

【输入】root = [1,4,5,4,4,5]
【输出】2
【解释】4——>4——>4

提示:

  • 树的节点数的范围是 [0, 10^4] 
  • -1000 <= Node.val <= 1000
  • 树的深度将不超过 1000

三、解题思路

根据题目描述,我们需要在一个指定的二叉树上,找到一个最长的路径长度,这个路径有什么特点呢?就是路径上所有节点的值要一致。那么,既然是要对二叉树进行操作,我们常用的就是深度遍历和广度遍历了。那么,本题涉及到的是相同值的节点路径长度的判断,那么,符合深度遍历的解题方式 ,也就是说,针对每条分支去判断,如果发现节点不同了,那么则结束路径长度统计,开启新的路径长度统计。

那么,既然是统计路径长度,下面我列出了5种树的形状,其实,大体上,应该是3种:

第一种:相同值的节点在同一侧。如:形状1和性状2;
第二种:相同值的节点组成最小二叉树结构,即:根节点+左子树节点+右子树节点。如:形状3;
第三种:第一种和第二种的组合。如:形状4和性状5;

细心的同学会发现,你说的第一种和第三种其实也是一样的啊,第一种只不过是树节点缺少了左子树或者右子树啊。其实是这样子的,但是为了便于理解下面要介绍的路径长度计算,此处暂时把它们归为了两类。其实,最终我们会发现,无论是哪种形状,都是多个形状3的拼装而已,区别就是左右子树是否存在

现在,我们再来看一下如何计算路径长度,我们拆分一下形状1和形状4,发现它们的路径长度,就是可以拆分的最小二叉树的个数。如下所示:

那么在解这道题的是,就变成了计算最小二叉树的个数了,由于路径计算是累加的,所以,每当我们要将累加值返回给父节点的时候,是根据左子树和有子树累积的长度谁更大,以谁为准。请看下图:

上面就是大致的解题思路了。具体实现,请参照下面四:代码实现部分

四、代码实现

class Solution {
    int result = 0;
    public int longestUnivaluePath(TreeNode root) {
        calculate(root);
        return result;
    }
    public int calculate(TreeNode node) {
        if (node == null) return 0;
        int leftValue = calculate(node.left);
        int rightValue = calculate(node.right);
        leftValue = (node.left != null && node.val == node.left.val) ? ++leftValue : 0; 
        rightValue = (node.right != null && node.val == node.right.val) ? ++rightValue : 0;
        result = Math.max(result, leftValue + rightValue);
        return Math.max(leftValue, rightValue);
    }
}

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

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

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

相关文章:

  • springboot大学生兼职网站毕业设计源码311734
  • (附源码)springboot掌上博客系统 毕业设计063131
  • STM32-按键检测
  • Java 大后端各种架构图汇总(建议收藏)
  • IEC61499的理解及相关应用
  • 老生常谈:学习Java自学好还是报培训班?
  • 独立级联(Independent Cascade)模型的原理及代码实现
  • python笔记Ⅵ--函数、函数的参数
  • NOA市占率超50%+影子模式,这家中国车企走出一条不寻常道路
  • 项目经理带团队,这6个坑一定要避开
  • 新手小白适合做哪个跨境电商平台?测评自养号能带来哪些收益及优势?
  • 网站SEO规范
  • Linux云服务器:MySQL安装失败、多种错误总结 | 个人解决参考
  • DockerHub 镜像仓库原理
  • Java 同步工具与组合类的线程安全性分析
  • create-react-app做的留言板
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • HTTP 简介
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • js中forEach回调同异步问题
  • js作用域和this的理解
  • React16时代,该用什么姿势写 React ?
  • Redis学习笔记 - pipline(流水线、管道)
  • Sass Day-01
  • Vue 重置组件到初始状态
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 蓝海存储开关机注意事项总结
  • 聊聊hikari连接池的leakDetectionThreshold
  • 前端工程化(Gulp、Webpack)-webpack
  • 试着探索高并发下的系统架构面貌
  • 移动端解决方案学习记录
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • 远离DoS攻击 Windows Server 2016发布DNS政策
  • 转载:[译] 内容加速黑科技趣谈
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • ​2021半年盘点,不想你错过的重磅新书
  • ​LeetCode解法汇总518. 零钱兑换 II
  • ​批处理文件中的errorlevel用法
  • #pragma data_seg 共享数据区(转)
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (4.10~4.16)
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (论文阅读30/100)Convolutional Pose Machines
  • (一) storm的集群安装与配置
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .htaccess配置常用技巧
  • .net Application的目录
  • .NET 简介:跨平台、开源、高性能的开发平台
  • .net 托管代码与非托管代码