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

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

LeetCode算法题-Longest Univalue Path(Java实现)的更多相关文章

  1. LeetCode算法题-Longest Word in Dictionary(Java实现)

    这是悦乐书的第303次更新,第322篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第171题(顺位题号是720).给出表示英语词典的字符串单词数组,找到单词中长度最长的单 ...

  2. LeetCode算法题-Longest Continuous Increasing Subsequence(Java实现)

    这是悦乐书的第286次更新,第303篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第154题(顺位题号是674).给定未排序的整数数组,找到最长连续增加子序列的长度.例如 ...

  3. LeetCode算法题-Longest Harmonious Subsequence(Java实现)

    这是悦乐书的第270次更新,第284篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第136题(顺位题号是594).我们定义一个和谐数组是一个数组,其最大值和最小值之间的差 ...

  4. LeetCode算法题-Longest Uncommon Subsequence I(Java实现)

    这是悦乐书的第252次更新,第265篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第119题(顺位题号是521).给定一组两个字符串,您需要找到这组两个字符串中最长的不同 ...

  5. 【LeetCode】687. Longest Univalue Path 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 DFS 日期 题目地址:https://leetco ...

  6. LeetCode算法题-Rotate String(Java实现)

    这是悦乐书的第317次更新,第338篇原创 在开始今天的算法题前,说几句,今天是世界读书日,推荐两本书给大家,<终身成长>和<禅与摩托车维修艺术>,值得好好阅读和反复阅读. 0 ...

  7. LeetCode算法题-Rotated Digits(Java实现)

    这是悦乐书的第316次更新,第337篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第185题(顺位题号是788).如果一个数字经过180度旋转后,变成了一个与原数字不同的 ...

  8. LeetCode算法题-Toeplitz Matrix(Java实现)

    这是悦乐书的第312次更新,第333篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第181题(顺位题号是766).如果从左上角到右下角的每个对角线具有相同的元素,则矩阵是 ...

  9. LeetCode算法题-Flood Fill(Java实现)

    这是悦乐书的第306次更新,第325篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第173题(顺位题号是733).图像由二维整数数组表示,每个整数表示图像的像素值(从0到 ...

随机推荐

  1. 论Java访问权限控制的重要性

    人在什么面前最容易失去抵抗力? 美色,算是一个,比如说西施的贡献薄就是忍辱负重.以身报国.助越灭吴:金钱,算是另外一个,我们古人常说“钱乃身外之物,生不带来死不带去”,但我们又都知道“有钱能使鬼推磨” ...

  2. Python Bs4 回顾

    BeautifulSoup bs4主要使用find()方法和find_all()方法来搜索文档. find()用来搜索单一数据,find_all()用来搜索多个数据 find_all()与find() ...

  3. Centos7 防火墙 firewalld 实用操作

    一.前言 Centos7以上的发行版都试自带了firewalld防火墙的,firewalld去带了iptables防火墙.其原因是iptables的防火墙策略是交由内核层面的netfilter网络过滤 ...

  4. Linux和Shell回炉复习系列文章总目录

    本页内容都是本人回炉Linux时整理出来的.这些文章中,绝大多数命令类内容都是翻译.整理man或info文档总结出来的,所以相对都比较完整. 本人的写作方式.风格也可能会让朋友一看就恶心到直接右上角叉 ...

  5. 如何正确使用Java泛型

    前言 Java 1.5之前是没有泛型的,以前从集合中读取每个对象都必须先进行转换,如果不小心存入集合中对象类型是错的,运行过程中转换处理会报错.有了泛型之后编译器会自动帮助转换,使程序更加安全,但是要 ...

  6. 第一次AOP,附上使用DEMO,可用在简单生产环境了

    demo代码如下 public class ConsoleTimeAttribute : ApectBaseAttribute { public override void Before(ApectC ...

  7. C#设计模式之二十二备忘录模式(Memento Pattern)【行为型】

    一.引言 今天我们开始讲“行为型”设计模式的第十个模式,该模式是[备忘录模式],英文名称是:Memento Pattern.按老规矩,先从名称上来看看这个模式,个人的最初理解就是对某个对象的状态进行保 ...

  8. import提升导致Fundebug报错:“请配置apikey”

    摘要: 解释一下"请配置apikey"报错的原因. 部分Fundebug用户使用import来导入js文件时,出现了"请配置apikey"的报错,这是由于imp ...

  9. vue中使用Element主题自定义肤色

    一.搭建好项目的环境. 二.根据ElementUI官网的自定义主题(http://element.eleme.io/#/zh-CN/component/custom-theme)来安装[主题生成工具] ...

  10. 2019-02-20 在PyPI测试平台发布Python包

    参考Packaging Python Projects, 源码在nobodxbodon/test-package-for-pypi 包名/__init__.py: 测试变量 = "值&quo ...