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

LeetCode 每日一题——687. 最长同值路径

1.题目描述

687. 最长同值路径

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

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

示例 1:

输入:root = [5,4,5,1,1,5]
输出:2

示例 2:

输入:root = [1,4,5,4,4,5]
输出:2

2.解题思路与代码

2.1 解题思路

这是一道比较简单的二叉树递归遍历应用题目。要获取一颗子树相同值节点的最大路径,那么我们就可以使用递归遍历树中节点的左右子树,并返回这个节点左右子树相同节点的最大路径 left 和 right,然后将 left 和 right 相加再加上 1 (当前节点)便是以当前节点 node 为根的树相同节点的路径 path,再求出这棵树中的最大 path 便是最终结果。在遍历的同时,还需要计算以当前节点为根相同节点的左右子树的最大深度 depth。使用全局遍历 max 来记录这棵树同值路径的最大值。

2.2 代码

class Solution {
    int max = 0;

    public int longestUnivaluePath(TreeNode root) {
        process(root);
        return max;
    }

    public int process(TreeNode root) {
        if (root == null) {
            return 0;
        }
        // 记录当前节点为根的子树的同值路径
        int path = 0;
        // 记录当前节点左右子树的最长同值路径
        int depth = 0;
        int left = process(root.left);
        int right = process(root.right);
        if (root.left != null && root.val == root.left.val) {
            // 计算当前节点的左子树同值路径
            path += left + 1;
            // 计算左子树同值路径长度
            depth += left + 1;
        }
        if (root.right != null && root.val == root.right.val) {
            // 计算当前节点的左子树加右子树同值路径
            path += right + 1;
            // 计算右子树同值路径长度
            depth = Math.max(depth, right + 1);
        }
        // 计算同值路径的最大值
        max = Math.max(max, path);
        return depth;
    }
}

2.3 测试结果

通过测试
测试结果

3.总结

  • 递归遍历这棵二叉树
  • 使用 path 记录当前节点为根的子树的同值路径
  • 使用 depth 记录当前节点为根的子树的左右子树同值路径的最大值,并作为递归函数的返回

相关文章:

  • 外部数据评价函数
  • js---深拷贝函数
  • ElasticSearch linux上重启
  • elasticsearch object、nested类型对比
  • 词法、语法、语义分析编译原理设计
  • mybatis的小于号<的转义
  • IC Compiler指南——布图规划(一)
  • 债券行情查询接口
  • Flask 学习-28.flask_jwt_extended插件 JWT 中存储额外数据(additional_claims)
  • Unity 场景光照出现问题
  • SpringCloud Feign报错Method has too many Body parameters
  • 如何让GPU加速20倍?AI数据平台是关键!
  • 通达OA系统,MYOA中OfficeRedis启动不了
  • ‘scp‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件
  • Kubernetes中gRPC的服务发现
  • JavaScript-如何实现克隆(clone)函数
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • 【面试系列】之二:关于js原型
  • Akka系列(七):Actor持久化之Akka persistence
  • angular学习第一篇-----环境搭建
  • Linux各目录及每个目录的详细介绍
  • Netty 4.1 源代码学习:线程模型
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • PHP变量
  • 包装类对象
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 订阅Forge Viewer所有的事件
  • 分布式任务队列Celery
  • 构建工具 - 收藏集 - 掘金
  • 类orAPI - 收藏集 - 掘金
  • 数据仓库的几种建模方法
  • 鱼骨图 - 如何绘制?
  • 责任链模式的两种实现
  • 自制字幕遮挡器
  • ​Java并发新构件之Exchanger
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • #14vue3生成表单并跳转到外部地址的方式
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (论文阅读26/100)Weakly-supervised learning with convolutional neural networks
  • (三分钟)速览传统边缘检测算子
  • (十八)三元表达式和列表解析
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • (四)图像的%2线性拉伸
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • (转)Linux NTP配置详解 (Network Time Protocol)
  • (转)关于pipe()的详细解析
  • (转)使用VMware vSphere标准交换机设置网络连接
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...
  • .form文件_一篇文章学会文件上传
  • .gitignore文件_Git:.gitignore
  • .NET Core 中的路径问题
  • .NET 将多个程序集合并成单一程序集的 4+3 种方法
  • .NET设计模式(2):单件模式(Singleton Pattern)
  • .NET下ASPX编程的几个小问题