( “树” 之 DFS) 687. 最长同值路径 ——【Leetcode每日一题】

news/2024/7/20 23:01:21 标签: leetcode, 深度优先, 算法

687. 最长同值路径

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

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

示例 1:

在这里插入图片描述

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

示例 2:

在这里插入图片描述

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

提示:

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

思路:DFS

分析:

对任意一个节点,有两种可能,最大路径可能经过该节点,或者不经过该节点

  • 最大路径经过该节点时:
    • 若该节点为最大路径的根节点root时, 路径长度左子树的路径长度加上右子树的路径长度
    • 若节点不是最大路径的根节点时,则最大路径的根节点root一定在其父节点上,此时返回其左右子树的路径的最大值
  • 最大路径不经过该节点时,返回0.

设计:(从下往上判断)

根据上述分析,设计递归函数int dfs(TreeNode root)

  • 含义为传入根节点 root, 返回最大路径经过该节点,但是该节点不是最大路径的根节点,即返回其左右子树的路径的最大值
  • 同时设置全局变量path,记录最大路径,在每个节点为根节点时判断更新,即左子树的路径长度加上右子树的路径长度
  • 在递归函数内部,先通过递归 root 的左右子节点,拿到以 root.leftroot.right 为起点的最大路径长度 leftright ,然后以root节点为最大路径的根节点 ,分别判断左右子树的val值是否等于root.val,如果相等则加1,不等则为0
  • 同时更新最大路径path

代码:(Java、C++)

Java

/**
 * 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 {
    private int path = 0;
    public int longestUnivaluePath(TreeNode root) {
        dfs(root);
        return path;
    }
    public int dfs(TreeNode root){
        if(root == null) return 0;
        int left = dfs(root.left);
        int right = dfs(root.right);
        int leftPath = root.left != null && root.val == root.left.val ? 1 + left : 0;
        int rightPath = root.right != null && root.val == root.right.val ? 1 + right : 0;
        path = Math.max(path, leftPath + rightPath); 
        return Math.max(leftPath, rightPath);
    }
}

C++

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    int path = 0;
    int longestUnivaluePath(TreeNode* root) {
        dfs(root);
        return path;
    }
    int dfs(TreeNode* root){
        if(root == NULL) return 0;
        int left = dfs(root->left);
        int right = dfs(root->right);
        int leftPath = root->left != NULL && root->val == root->left->val ? 1 + left : 0;
        int rightPath = root->right != NULL && root->val == root->right->val ? 1 + right : 0;
        path = max(path, leftPath + rightPath); 
        return max(leftPath, rightPath);
    }
};

运行结果:

复杂度分析:

  • 时间复杂度 O ( n ) O(n) O(n),其中 n 为树的结点数目。
  • 空间复杂度 O ( n ) O(n) O(n)。递归栈最坏情况下需要 O ( n ) O(n) O(n)的空间。

题目来源:力扣。

放弃一件事很容易,每天能坚持一件事一定很酷,一起每日一题吧!
关注我 leetCode专栏,每日更新!

注: 如有不足,欢迎指正!


http://www.niftyadmin.cn/n/229129.html

相关文章

力扣javascript刷题343——动态规划之整数拆分

这几天有在开始投暑期实习的简历&#xff0c;可能确实是投的太晚了&#xff0c;好多厂都没有hc了&#xff0c;阿里简历面都没过&#xff08;感觉是kpi面试&#xff09;&#xff0c;被深深打击到了呜呜呜&#xff0c;花了两天整理情绪&#xff0c;重新出发&#xff0c;下篇文章针…

C++ 中 static_cast , dynamic_cast , const_cast , reinterpret_cast 类型转换使用详解

文章目录前言const_cast原生数据类型自定义数据类型static_castreinterpret_castdynamic_cast向上转型&#xff08;Upcasting&#xff09;向下转型&#xff08;Downcasting&#xff09;前言 隐式类型转换是安全的&#xff0c;显式类型转换是有风险的&#xff0c;C语言之所以增…

mmsegmentation 训练自己的数据集

一. MMSegmentation是什么&#xff1f; MMSegmentation 是一个基于 PyTorch 的语义分割开源工具箱&#xff0c;它是 OpenMMLab 项目的一部分。他与MMDetection类似&#xff0c;集成了各种语义分割算法&#xff0c;可以快速验证语义分割效果。 二. 环境准备 参考&#xff1a…

Linux namespace

​ 前言 从《initrd&init进程》可知&#xff0c;我们通过ssh连接linux服务器&#xff0c;其实主是linux启动一shell进程与我们做交互。而Linux又是多租户的&#xff0c;这使用得用户与用户间产生了&#xff0c;资源的争抢。 如何隔离资源&#xff0c;且让用户都无法察觉&…

vue+element-plus上传图片功能以及回显问题还有数量限制

组件库 目录 此篇可以完整帮助你解决编辑回显问题以及数量问题 属性介绍&#xff1a; 1.引入&#xff1a; 2.html&#xff1a; 3.css&#xff1a; 4.js&#xff1a; 组件库 此篇可以完整帮助你解决编辑回显问题以及数量问题 常用的属性介绍&#xff1a; 首先hide_box…

FAT32文件系统学习

FAT32文件系统组成及介绍 FAT32文件系统结构图&#xff1a; 下图演示了FAT32文件系统的DBR&#xff1a; 1.DBR及其保留扇区&#xff1a;含义是DOS引导记录&#xff0c;也称为操作系统引导记录&#xff0c;在DBR之后往往有一些保留扇区 跳转指令&#xff1a;跳转指令本身占用2字…

1.mybatis-plus入门及使用

1.什么是MybatisPlus MyBatis-Plus 官网 为什么要学MybatisPlus&#xff1f; MybatisPlus可以节省大量时间&#xff0c;所有的CRUD代码都可以自动化完成MyBatis-Plus是一个MyBatis的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效…

Pytorch实现FCN图像语义分割网络

针对图像的语义分割网络&#xff0c;本节将介绍PyTorch中已经预训练好网络的使用方式&#xff0c;然后使用VOC2012数据集训练一个FCN语义分割网络。 一、使用预训练好的语义分割网络 PyTorch提供了已预训练好的图像语义分割网络&#xff0c;已经预训练好的可供使用的网络模型…