LeetCode算法题-Longest Univalue Path(Java实现)

本文介绍了解决LeetCode算法题中寻找二叉树中最长相同值路径的方法。通过两种不同的递归策略实现,一种关注节点值相同的最长路径边长,另一种侧重于节点值相等时路径的累加。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这是悦乐书的第290次更新,第308篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第158题(顺位题号是687)。给定二叉树,找到路径中每个节点具有相同值的最长路径的长度。此路径可能会也可能不会通过根目录。例如:

输入:

              5
             / \
            4   5
           / \   \
          1   1   5

输出:路径为[5,5,5],边长为2


输入:

              1
             / \
            4   5
           / \   \
          4   4   5

输出:路径为[4,4,4],边长为2


注意:

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

  • 给定的二叉树不超过10000个节点。 树的高度不超过1000。

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 第一种解法

此题与求二叉树的最长路径边长相似,只是此题要求是节点值相同的路径,也就是说在找最长路径的时候,还需要判断节点值,要是不相同,就重置为0,在此期间,我们使用一个全局变量来存储最长节点值相同路径的边长。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    int count = 0;
    public int longestUnivaluePath(TreeNode root) {
        helper(root);
        return count;
    }

    public int helper(TreeNode node){
        if (node == null) {
            return 0;
        }
        int left = helper(node.left);
        int right = helper(node.right);
        if (node.left == null || node.left.val != node.val) {
            left = 0;
        }
        if (node.right == null || node.right.val != node.val) {
            right = 0;
        }
        count = Math.max(count, left+right);
        return Math.max(left, right)+1;
    }
}


03 第二种解法

如果你对上面的解法不太理解,尤其是递归方法最后一步返回left与right中的最大值再加1,可以看看此种解法。在处理完左子树的节点后,如果当前节点和其左子节点的节点值相等,那么left就在原基础上加1,否则就重置为0。因为要想最长,从当前节点开始,就是其左右子树中的最长相同节点值路径加上当前节点本身。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {

    int count = 0;
    public int longestUnivaluePath(TreeNode root) {
        helper(root);
        return count;
    }

    public int helper(TreeNode node){
        if (node == null) {
            return 0;
        }
        int left = helper(node.left);
        int right = helper(node.right);
        left = node.left != null && node.left.val == node.val ? left+1 : 0;
        right = node.right != null && node.right.val == node.val ? right+1 : 0;
        count = Math.max(count, left+right);
        return Math.max(left, right);
    }
}


04 小结

算法专题目前已日更超过四个月,算法题文章158+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

转载于:https://www.cnblogs.com/xiaochuan94/p/10617222.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值