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


    这是悦乐书的第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+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

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

  • 相关阅读:
    Vue.js 2.x笔记:安装与起步(1)
    EntityFramework Core笔记:保存数据(4)
    EntityFramework Core笔记:查询数据(3)
    EntityFramework Core笔记:表结构及数据基本操作(2)
    EntityFramework Core笔记:入门(1)
    ASP.NET MVC系列:web.config中ConnectionString aspnet_iis加密与AppSettings独立文件
    EntityFramework优化:第一次启动优化
    EntityFramework优化:查询性能
    EntityFramework优化:查询WITH(NOLOCK)
    SpringCloud学习笔记:熔断器Hystrix(5)
  • 原文地址:https://www.cnblogs.com/xiaochuan94/p/10617222.html
Copyright © 2020-2023  润新知