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

先解释一下题目,就是让我们找到一个路径,这个路径上面的值都相同,而且可以不经过根节点,例如,例2中的4-4-4这样的。

刚做这道题的时候有种错觉,觉得就是在遍历二叉树,其实不然,求最长路径是没有回头路可走的,也就是说,每次递归只能返回该结点的左右结点的最大路径长度,不能返回两者之和。

但是求最大值的和是要用一个全局变量记录的,但是不能返回。

思路:如果当前节点值不和父节点相同,则返回0;若相同,则返回左右子树中边数较多的一个,加1是因为当他与父节点的值相同时,和父节点还有一个连线。maxL用来动态记录边数最多的路径。

  1. # Definition for a binary tree node.
  2. class TreeNode(object):
  3. def __init__(self, x):
  4. self.val = x
  5. self.left = None
  6. self.right = None
  7.  
  8. class Solution (object):
  9. def longestUnivaluePath(self, root):
  10. """
  11. :type root: TreeNode
  12. :rtype: int
  13. """
  14. maxL = 0
  15. def getMaxL(node,val):
  16. nonlocal maxL #用来在函数或其他作用域中使用外层(非全局)变量。
  17. if node == None:
  18. return 0
  19. leftMaxL = getMaxL(node.left,node.val)
  20. rightMaxL = getMaxL(node.right,node.val)
  21. maxL = max(maxL, leftMaxL + rightMaxL)
  22. print('node=%s,maxL=%s'%(node.val,maxL))
  23. if node.val == val:
  24. return max(leftMaxL,rightMaxL) + 1
  25. else:
  26. return 0
  27. if root != None:
  28. getMaxL(root,root.val)
  29. return maxL
  30.  
  31. def longestUnivaluePath1(self,root):
  32. res = 0
  33. def dns(node):
  34. nonlocal res
  35. if node == None:
  36. return 0
  37. lmax = dns(node.left)
  38. rmax = dns(node.right)
  39. if node.left and node.left.val == node.val:
  40. lmax = lmax + 1
  41. else:
  42. lmax = 0
  43.  
  44. if node.right and node.right.val == node.val:
  45. rmax = rmax + 1
  46. else:
  47. rmax = 0
  48. res = max(res,lmax+rmax) #最大值是当前的最大值或者左右孩子路径的和。
  49. return max(lmax,rmax) #返回值是左右路径中的最大值,因为它还需要和父节点继续构建路径。
  50.  
  51. dns(root)
  52. return res
  53.  
  54. root = TreeNode(1)
  55. Node1 = TreeNode(4)
  56. Node2 = TreeNode(5)
  57. Node3 = TreeNode(5)
  58. Node4 = TreeNode(4)
  59. Node5 = TreeNode(5)
  60. Node6 = TreeNode(5)
  61.  
  62. root.left = Node1
  63. root.right = Node2
  64. Node1.left = Node3
  65. Node1.right = Node4
  66. Node2.right = Node5
  67. Node3.left = Node5
  68. Node5.left = Node6
  69.  
  70. S = Solution()
  71. res = S.longestUnivaluePath1(root)
  72. print(res)

结果为2

LeetCode--687. 最长同值路径的更多相关文章

  1. Java实现 LeetCode 687 最长同值路径(递归)

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

  2. 【二叉树-最长路径系列(任意路径)】直径、最长同值路径、 最大路径和(DFS、树形DP)

    总述 这类题目都是求一个最长路径,这个路径可以不经过根节点. 使用dfs(即递归地遍历树)的方法.维护一个全局最长路径max作为最终结果,而递归方法dfs返回的是含根节点的最长路径.(若不使用全局变量 ...

  3. [LeetCode] 687. Longest Univalue Path 最长唯一值路径

    Given a binary tree, find the length of the longest path where each node in the path has the same va ...

  4. LeetCode687----最长同值路径

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

  5. LeetCode 687. Longest Univalue Path 最长同值路径 (C++/Java)

    题目: Given a binary tree, find the length of the longest path where each node in the path has the sam ...

  6. [Swift]LeetCode687. 最长同值路径 | Longest Univalue Path

    Given a binary tree, find the length of the longest path where each node in the path has the same va ...

  7. Leetcode687.Longest Univalue Path最长同值路径

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

  8. [LeetCode] Longest Univalue Path 最长相同值路径

    Given a binary tree, find the length of the longest path where each node in the path has the same va ...

  9. AcWing:144. 最长异或值路径(dfs + 01字典树)

    给定一个树,树上的边都具有权值. 树中一条路径的异或长度被定义为路径上所有边的权值的异或和: ⊕ 为异或符号. 给定上述的具有n个节点的树,你能找到异或长度最大的路径吗? 输入格式 第一行包含整数n, ...

随机推荐

  1. MFC onchar()

    为什么在CView类中可以对ON_CHAR进行相应,添加消息处理函数onchar就可以了,但是在CDialog中要对ON_CHAR相应,直接添加不行? CView相当于Text控件,你可以在Text控 ...

  2. python中字符串(str)的常用处理方法

    str='python String function' 生成字符串变量str='python String function' 字符串长度获取:len(str)例:print '%s length= ...

  3. 使用SQLite3工具查看sqlite.db文件

    http://www.sqlite.org OS X自从10.4后把SQLite这套相当出名的数据库软件,放进了作业系统工具集里.OS X包装的是第三版的SQLite,又称SQLite3.这套软件有几 ...

  4. DragonBones龙骨骨骼中的自定义事件(另有声音、动画事件)

    参考: DragonBones骨骼动画事件系统详解 一.在DragonBones中添加自定义事件帧 动画制作时 时间轴拉到最下面有一个事件层,添加一个事件帧 左边属性面板定义自定义事件 二.Egret ...

  5. 关于C#泛型作用的简单说明

    泛型:即通过参数化类型来实现在同一份代码上操作多种数据类型.泛型编程是一种编程范式,它利用“参数化类型”将类型抽象化,从而实现更为灵活的复用. C#泛型的作用概述 C#泛型赋予了代码更强的类型安全,更 ...

  6. mysql补充(3)优化sql语句查询常用的30种方法

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索 ...

  7. iOS - 开发屏幕及视图层次

    //屏幕视图分层 .UIWindow .UILayoutContainerView .UITransitionView .UIViewControllerWrpaperView .UILayoutCo ...

  8. thinkCMF----公共模板的引入

    这个主要用于前台模板的 头部和底部分离: 具体引入方法: <include file="public@source"/> <include file=" ...

  9. thinkphp实现采集功能的三种方法!

    最近在做一些数据分析,由于上网找数据比较麻烦,所以写了一个采集网站数据的方法.具体方法如下: 方法一:QueryList 个人感觉比较好用,采集详情比较不错的选择,但是采集复杂一点的列表,不好用.具体 ...

  10. python-django开发学习笔记一

    1.简述 1.1 开发环境 该笔记所基于的开发环境为:windows8.python2.7.5.psycopg2-2.4.2.django1.5.4.pyCharm-2.7.3.以上所描述的软件.插件 ...