【LeetCode】最长同值路径 [M](二叉树)

news2024/10/7 4:28:23

687. 最长同值路径 - 力扣(LeetCode)

一、题目

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

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

示例 1:

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

示例 2:

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

提示:

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

二、代码

/**
 * 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 {
    // 建设以x节点为头的树,返回两个信息
    public class Info {
        // 在一条路径上:要求每个节点通过且只通过一遍
        public int max; // 路径必须从x出发且只能往下走的情况下,路径的最大距离
        public int len; // 路径不要求必须从x出发的情况下,整棵树的合法路径最大距离

        public Info(int max, int len) {
            this.max = max;
            this.len = len;
        }
    }

    public int longestUnivaluePath(TreeNode root) {
        if (root == null) {
            return 0;
        }

        return process(root).max - 1;
    }

    public Info process(TreeNode x) {
        // 如果递归到空姐点,直接返回info(0,0)
        if (x == null) {
            return new Info(0, 0);
        }

        TreeNode left = x.left;
        TreeNode right = x.right;
        // 左树上,不要求从左孩子出发,最大路径
		// 左树上,必须从左孩子出发,往下的最大路径
        Info leftInfo = process(left);
        // 右树上,不要求从右孩子出发,最大路径
		// 右树上,必须从右孩子出发,往下的最大路径
        Info rightInfo = process(right);

        // 1、必须从x出发的情况下,往下的最大路径
        // 初始路径只有x一个节点,len初始化为1
        int len = 1;
        // 先去看x的左子树的根节点,val是不是和x一样,如果一样就可以连成一条路径,更新len
        if (left != null && left.val == x.val) {
            len = leftInfo.len + 1;
        }
        // 再去用相同的标准判断右子树,更新len
        if (right != null && right.val == x.val) {
            len = Math.max(len, rightInfo.len + 1);
        }

        // 2、不要求必须从x出发(路径可以路过x,也可以不路过x),最大路径
        // len:从x出发,只往一侧向下延伸的最大同值路径长度
        // Math.max(leftInfo.max, rightInfo.max):以x为根的树上,不路过x节点的最大同值路径长度
        // 上面两者取最大值
        int max = Math.max(len, Math.max(leftInfo.max, rightInfo.max));
        // 然后再去看是不是可以左右两个子树的路径都可以连接到x,这样整个路径就是从左子树到x再到右子树,计算这种情况的路径长度
        if (left != null && right != null && left.val == x.val && right.val == x.val) {
            // 与max比较,尝试推高max
            max = Math.max(max, leftInfo.len + rightInfo.len + 1);
        }

        // 返回当前以x为根的这棵树的info信息
        return new Info(max, len);
    }
}

三、解题思路

x作为当前的根节点

1、与x无关

①最长同值路径在左子树上

②最长同值路径在右子树上

2、与x有关

路径一定会经过x

③路径只有x自己

④路径从x开始往左延伸

⑤路径从x开始往右延伸

⑥路径从x往左右两边延伸

第⑥种情况时,其实④和⑤情况都是满足的,直接用④和⑤的长度相加就能得到⑥的答案。

info需要返回两个信息:

左树上不要求必须从根结点出发的情况下最大路径(路径可以过根节点,也可以不过根节点)

右树上不要求必须从根结点出发的情况下最大路径

+

左树上必须从根结点出发的最大路径(路径必须过根节点,并且起点是当前的根节点)

右树上必须从根结点出发的最大路径

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

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

相关文章

阿里二面: BigKey、HotKey 问题严重,该如何 预防和解决

BigKey、HotKey是 日常生产中经常会碰到由于redis集群的不当访问&#xff0c;造成的线上问题。 而且&#xff0c;这也是常见的面试题。 在咱们社群的面试交流中&#xff0c;有很多小伙伴在面试网易、滴滴、京东等大厂的二面、三面中遇到了这个问题。 前段时间&#xff0c;有…

Hadoop基础之《(9)—整合HBase+Phoenix+Hive》

一、HBase简介 1、HBase定义 Apache HBase是以HDFS为数据存储的&#xff0c;一种分布式、可扩展的NoSQL数据库&#xff08;非关系型&#xff0c;以k,v的形式存储数据&#xff09;。 HBase可以认为是以HDFS为存储的数据库。 2、HBase数据模型 &#xff08;1&#xff09;HBase的…

Python---方法(普通方法,类方法,静态方法)

专栏&#xff1a;python 个人主页&#xff1a;HaiFan. 专栏简介&#xff1a;Python基础已经更新完&#xff0c;接下来是Python面向对象的知识点。 方法前言普通方法类方法静态方法总结前言 方法是什么&#xff1f; 一个类&#xff0c;它有特征&#xff0c;也有动作&#xff0…

华为OD机试(2023)真题目录(Java JS Python)

本专栏算法题均来自2023华为OD机考新题库。 本专栏算法题全部支持Java、JavaScript、Python语言实现。 注意&#xff1a;本专栏只包含新题库题目&#xff0c;不包含老题库题目。如果想同时拥有新、老题库全部题目&#xff0c;请订阅华为OD机试&#xff08;2022&2023&#…

c/c++开发,C++类的常用基本函数实现案例

一、C类的常用基本函数 C类的常用基本函数主要包括&#xff1a;默认构造函数&#xff0c;普通构造函数&#xff0c;拷贝构造函数&#xff0c;析构函数&#xff0c;赋值&#xff08;&#xff0c;运算符重载&#xff09;函数&#xff1a; 1.默认构造函数&#xff0c;在没有显式初…

苹果电脑怎么用移动硬盘ntfs?教你三招方法

苹果电脑怎么用移动硬盘ntfs&#xff1f;Mac可以正常读取NTFS外置设备上的文件&#xff0c;但是不能够正常往里面写入文件&#xff0c;同样不能对上面的文件进行编辑、删除、移动等&#xff0c;如果想要进行这些操作。 一、什么是NTFS NTFS是一个日志文件系统&#xff0c;这意…

稍纵即逝,读博期间要注意的事情 / 读博期间一定不要做的事

稍纵即逝&#xff0c;读博期间要注意的事情 读博期间一定不要做的10件事 tip&#xff1a;配图除了缓解文章疲劳&#xff0c;就没有其它意图了。 时间稍纵即逝&#xff0c;博士期间的科研时间其实非常紧张和短缺。对于刚入学的博士新生&#xff0c;尤其是直博生和长学制&#…

DMA驱动开发---认识DMA

DMA定义&#xff1a; DMA用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU的干预&#xff0c;通过DMA数据可以快速地移动。这就节省了CPU的资源来做其他操作。 DMA传输方式&#xff1a; DMA的作用就是实现数据的直接传输&#xff0c;而去掉了传统数…

Go 恶意软件增多,分析两个新发现的零检出样本

由于 Go 良好的跨平台特性&#xff0c;在多个操作系统与架构上都能运行&#xff0c;所以最近使用 Go 语言编写的恶意软件越来越多&#xff0c;每周都会发现大量的新样本。 在四月末&#xff0c;研究人员通过蜜罐发现了两个新的变种&#xff08;Backdoorit和 Caligula&#xff…

AOSP 8.0 系统启动概要

目录 一、Android 系统启动流程图 二、系统启动阶段 三、 系统重要进程 3.1 父进程 3.2 重量级进程 一、Android 系统启动流程图 备注&#xff1a;&#xff08;图片引用gityuan&#xff09; 二、系统启动阶段 step1. 启动电源及系统&#xff1a;电源按下后&#xff0c;引…

家庭网络WIFI相关知识

文章目录参考资料路由器的最大下载速率WFI协议WIFI工作频段和信道2.4GHZ频段5GHz频段双频路由器兼容性覆盖WIFI信号为什么总这么差&#xff1f;参考资料 WiFi穿墙完全指南&#xff1a;你的网速是由什么决定的&#xff1f; 路由器的最大下载速率 所谓的450M路由器中的“450M”…

【Catalyst 9000 内嵌抓包方法】

新的一年 新的征程 新的课程开班 等你来学&#xff01; 1.在特权模式下进入如下配置 switch#monitor capture XXX interface Gix/x/x both 或 control-plan both <<<<< control-plan为CPU抓包 switch#monitor capture XXX match any 或 access-list XX swi…

4.6--贪心--最小生成树(MST)

一共有两种方法Prim算法和Kruskal算法都可以看作是应用贪心算法设计策略的例子。 Prim算法--选集合S中所有顶点的邻接点 距离最短的那个点&#xff08;不属于S&#xff09;加入集合S Kruskal算法--每次选取最短的且不构成回路的边 它们都利用了下面的最小生成树性质&#xf…

VRP系统下增加网络设备安全性之console接口

VRP即华为设备的操作系统 增加网络设备安全性的其中一种措施是增加console的安全 增强console安全性 1、使用密码登陆 首先先进入设备的console接口&#xff1a; 在进入系统视图时&#xff0c;可以使用system-view或sys 在进入console接口时&#xff0c;可以使用user-inte…

RPC的序列化方案详解

1 为什么需要序列化&#xff1f; 网络传输的数据须是二进制数据&#xff0c;但调用方请求的出入参数都是对象&#xff1a; 对象不能直接在网络传输&#xff0c;需提前转成可传输的二进制&#xff0c;且要求可逆&#xff0c;即“序列化” 将对象转换成二进制数据 这时&#xf…

拉伯证券|磷酸铁锂电池低温性能怎么解?

磷酸铁锂系电池本钱相对三元系电池低&#xff0c;且安全性好&#xff0c;寿命长。随着技能的前进&#xff0c;实践能量密度也在无限挨近理论能量密度。所以其市场占有率也在稳步上升&#xff0c;且现已超越三元系锂电池的装机量。 但磷酸铁锂&#xff08;LiFePO4&#xff0c;L…

Java网络编程 - UDP通信

文章目录UDP通信快速入门一发一收多发多收广播组播UDP通信 快速入门 UDP协议的特点: UDP是一种无连接、不可靠传输的协议。 将数据源IP、目的地IP和端口以及数据封装成数据包&#xff0c;大小限制在64KB内&#xff0c;直接发送出去即可。 UDP协议通信首先要有DatagramPacket数…

flume kafka channel 应用详解

1 官方文档 Documentation -> Flume User Guide2 kafka source (消费者) Kafka Source is an Apache Kafka consumer that reads messages from Kafka topics. If you have multiple Kafka sources running, you can configure them with the same Consumer Group so each …

2.DjangoRestFramework【基于DRF的RESTAPI的序列化使用】

进入Django rest framwork官网就能看到rest_framwork相关的教程; 1.安装rest_framwork pip install djangorestframework pip install markdown # Markdown support for the browsable API. pip install django-filter # Filtering support2.在setting中注册 setting…

QT-线性拟合(自动找直线区域)

最近有个需求&#xff0c;需要对一个S曲线的散点图做线性拟合&#xff0c;百度上线性拟合和曲线拟合公式很多&#xff0c;没什么问题&#xff0c;但需求里面有一个预期就是自动找出直线部分&#xff0c;前面因为其它事情耽搁&#xff0c;一直没有实现&#xff0c;心里多少有点梗…