类型:Easy, 递归

题目描述:

Given a binary tree, find the length of the longest path where each node in the path has the same value. This path may or may not pass through the root.

Note: The length of path between two nodes is represented by the number of edges between them.

Example 1:
Input:

          5/ \4   5/ \   \1   1   5

Output:
2

Example 2:
Input:

          1/ \4   5/ \   \4   4   5

Output:
2

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = Noneclass Solution:def longestUnivaluePath(self, root):""":type root: TreeNode:rtype: int"""self.max_path = 0if root == None:return 0self.recursive_find(root)return self.max_pathdef recursive_find(self,root):if root == None:return 0left = self.recursive_find(root.left)right = self.recursive_find(root.right)if (root.left != None and root.val == root.left.val):left +=  1elif (root.left != None): # 只是非空left = 0if (root.right != None and root.val == root.right.val):right += 1elif (root.right != None):right = 0if left + right > self.max_path:self.max_path = left + rightreturn max(left, right)

能用递归解决问题的,一定是自顶向下。
那么这个问题也是,站在当前结点上思考,左子树的最长路径已经知道了,右子树的最大路径也已经知道了。那么,现在需要做的决策是,结合当前结点值,如何更新最大的路径长度 。用left标记左子树的最大路径长度,right标记右子树的最大路径长度。

第一种情况,左子树非空,且左子树的根结点与当前结点值相同,那么left+1;否则,将left置为0,因为现在考虑的是对max_path是否增量更新。另外一种担忧是,最长路径不一定经过根结点,为什么判断的子树根结点和当前结点值相同时就可以加1呢?这个要从递归会递归到终结退出条件来思考,逐层向上展开。

同样的,右子树思考路径对称过去即可。

现在开始更新最大路径,left + right > max_path吗?

如果当前结点的值与左子树根结点值,右子树结点值都相同,那么left自增1,右子树自增1,合起来最长路径增加2.

如果只有一个子树的根结点值与当前结点值相同,则只有单边子树自增1,另外一个子树的大小置为0。

END.

【Leetcode 687】递归求最大相同路径相关推荐

  1. LeetCode 687. 最长同值路径(二叉树,递归)

    1. 题目 给定一个二叉树,找到最长的路径,这个路径中的每个节点具有相同值. 这条路径可以经过也可以不经过根节点. 注意:两个节点之间的路径长度由它们之间的边数表示. 示例 1: 输入:5/ \4 5 ...

  2. Leetcode 687.最长同值路径

    Time: 20190901 Type: Easy 题目描述 给定一个二叉树,找到最长的路径,这个路径中的每个节点具有相同值. 这条路径可以经过也可以不经过根节点. 注意:两个节点之间的路径长度由它们 ...

  3. leetcode —— 687. 最长同值路径

    给定一个二叉树,找到最长的路径,这个路径中的每个节点具有相同值. 这条路径可以经过也可以不经过根节点. 注意:两个节点之间的路径长度由它们之间的边数表示.. -------------- 解题思路:使 ...

  4. 消除左递归c++代码_「leetcode」129. 求根到叶子节点数字之和【递归中隐藏着回溯】详解...

    链接 https://leetcode-cn.com/problems/sum-root-to-leaf-numbers/ 思路 本题和113.路径总和II是类似的思路,做完这道题,可以顺便把113. ...

  5. [LeetCode]124. 二叉树中的最大路径和(java实现)递归

    [LeetCode]124. 二叉树中的最大路径和(java实现)递归 1. 题目 2. 读题(需要重点注意的东西) 3. 解法 4. 可能有帮助的前置习题 5. 所用到的数据结构与算法思想 6. 总 ...

  6. 49 - 算法 - LeetCode 110 平衡二叉树 - 求二叉树的高度 -双重递归

    // 求二叉树的高度函数 nullptr为0 然后累加 +1 return left-right // 结论都还是递归 当前状态 多加了一个递归求高度 双重递归 class Solution {pub ...

  7. LeetCode 70爬楼梯71简化路径72编辑距离(dp)

    新人公众号(求支持):bigsai 专注于Java.数据结构与算法,一起进大厂不迷路! 算法文章题解全部收录在github仓库bigsai-algorithm,求star! 关注这个潇洒青年一起飞,回 ...

  8. 递归求嵌套数组中最大值

    今早在 https://attachments.me/hirehack/public/computer.html 做题,有一题是 递归求嵌套数组中最大值: /* This challenge requ ...

  9. 递归求最值(分治递归)

    输入n,再输入n个数,输出n个数中的最小值和最大值. 分治与递归! 代码: #include<iostream>using namespace std; void minmax(int * ...

最新文章

  1. Python—sqlalchemy
  2. android 画布旋转,Android-在安卓开发中,如何实现一个简单的图片旋转
  3. 在linux命令行 下学习编写java
  4. 搞懂深浅拷贝JavaScript内存之栈和堆
  5. 如何成立一家私募基金公司
  6. elk 搜索 语法_ELK学习笔记7| Lucence 的搜索语法
  7. WPF 实现ScrollViewer的垂直偏移滚动跳转
  8. 【转】[caffe]深度学习之图像分类模型AlexNet解读
  9. 信息学奥赛一本通 2059:【例3.11】买笔
  10. windows 下使用 nc 命令报错,与 Linux 不同。
  11. linux下tomcat发布网站验证码获取不到
  12. python epoll多路复用技术_python网络编程——IO多路复用之epoll
  13. 页面加载速度优化的建议
  14. 抄答案就是了,两套详细的设计方案,解决头疼的支付掉单问题
  15. Win10打开文件夹闪退怎么解决
  16. 生物药、创新药、仿制药新项目立项调研、评估的重要手段
  17. MITK中窗宽窗位相关代码
  18. Myeclipse错误: 找不到或无法加载主类 Dmaven.multiModuleProjectDirectory=$M2_HOME
  19. Ruby学习之日期 时间(Date Time)范围(Range)的定义和使用
  20. webgis期末考试试题_《WebGIS课程》期末考试复习资料

热门文章

  1. Ubuntu学习日记--Lesson10:gcc、make、makefile、cmake、cmakelists区别
  2. Modules Of YoloV5 Architecture
  3. 常见经典排序算法学习总结(插入、shell、冒泡、选择、归并、快排等)
  4. stl之multiset容器的应用
  5. glusphere设置球位置_玄武区举办桌上冰壶球比赛暨江苏省桌上冰壶球俱乐部联赛(玄武区站)活动...
  6. 360优化开机速度后慢了_提高电脑开机速度的优化技巧
  7. mysql2表连接优化性能_MySQL性能优化方法二:表结构优化
  8. ubuntu update和install失败,一种可以能的解决方法
  9. 网易云api接口_网易云音乐你喜欢吗?你自己也可以做一个
  10. Java break语句,标签