LeetCode--687. 最长同值路径
题目描述:给定一个二叉树,找到最长的路径,这个路径中的每个节点具有相同值。这条路径可以经过也可以不经过根节点。
注意:两个节点之间的路径长度由它们之间的边数表示。 示例1:
输入:
5
/ \
4 5
/ \ \
1 1 5
输出:2 示例 2:
输入:
1
/ \
4 5
/ \ \
4 4 5
输出:2
注意: 给定的二叉树不超过10000个结点.树的高度不超过1000。
先解释一下题目,就是让我们找到一个路径,这个路径上面的值都相同,而且可以不经过根节点,例如,例2中的4-4-4这样的。
刚做这道题的时候有种错觉,觉得就是在遍历二叉树,其实不然,求最长路径是没有回头路可走的,也就是说,每次递归只能返回该结点的左右结点的最大路径长度,不能返回两者之和。
但是求最大值的和是要用一个全局变量记录的,但是不能返回。
思路:如果当前节点值不和父节点相同,则返回0;若相同,则返回左右子树中边数较多的一个,加1是因为当他与父节点的值相同时,和父节点还有一个连线。maxL用来动态记录边数最多的路径。
# Definition for a binary tree node.
class TreeNode(object):
def __init__(self, x):
self.val = x
self.left = None
self.right = None class Solution (object):
def longestUnivaluePath(self, root):
"""
:type root: TreeNode
:rtype: int
"""
maxL = 0
def getMaxL(node,val):
nonlocal maxL #用来在函数或其他作用域中使用外层(非全局)变量。
if node == None:
return 0
leftMaxL = getMaxL(node.left,node.val)
rightMaxL = getMaxL(node.right,node.val)
maxL = max(maxL, leftMaxL + rightMaxL)
print('node=%s,maxL=%s'%(node.val,maxL))
if node.val == val:
return max(leftMaxL,rightMaxL) + 1
else:
return 0
if root != None:
getMaxL(root,root.val)
return maxL def longestUnivaluePath1(self,root):
res = 0
def dns(node):
nonlocal res
if node == None:
return 0
lmax = dns(node.left)
rmax = dns(node.right)
if node.left and node.left.val == node.val:
lmax = lmax + 1
else:
lmax = 0 if node.right and node.right.val == node.val:
rmax = rmax + 1
else:
rmax = 0
res = max(res,lmax+rmax) #最大值是当前的最大值或者左右孩子路径的和。
return max(lmax,rmax) #返回值是左右路径中的最大值,因为它还需要和父节点继续构建路径。 dns(root)
return res root = TreeNode(1)
Node1 = TreeNode(4)
Node2 = TreeNode(5)
Node3 = TreeNode(5)
Node4 = TreeNode(4)
Node5 = TreeNode(5)
Node6 = TreeNode(5) root.left = Node1
root.right = Node2
Node1.left = Node3
Node1.right = Node4
Node2.right = Node5
Node3.left = Node5
Node5.left = Node6 S = Solution()
res = S.longestUnivaluePath1(root)
print(res)
结果为2
LeetCode--687. 最长同值路径的更多相关文章
- Java实现 LeetCode 687 最长同值路径(递归)
687. 最长同值路径 给定一个二叉树,找到最长的路径,这个路径中的每个节点具有相同值. 这条路径可以经过也可以不经过根节点. 注意:两个节点之间的路径长度由它们之间的边数表示. 示例 1: 输入: ...
- 【二叉树-最长路径系列(任意路径)】直径、最长同值路径、 最大路径和(DFS、树形DP)
总述 这类题目都是求一个最长路径,这个路径可以不经过根节点. 使用dfs(即递归地遍历树)的方法.维护一个全局最长路径max作为最终结果,而递归方法dfs返回的是含根节点的最长路径.(若不使用全局变量 ...
- [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 ...
- LeetCode687----最长同值路径
给定一个二叉树,找到最长的路径,这个路径中的每个节点具有相同值. 这条路径可以经过也可以不经过根节点. 注意:两个节点之间的路径长度由它们之间的边数表示. 示例 1: 输入: 5 / \ 4 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 ...
- [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 ...
- Leetcode687.Longest Univalue Path最长同值路径
给定一个二叉树,找到最长的路径,这个路径中的每个节点具有相同值. 这条路径可以经过也可以不经过根节点. 注意:两个节点之间的路径长度由它们之间的边数表示. 示例 1: 输入: 5 / \ 4 5 / ...
- [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 ...
- AcWing:144. 最长异或值路径(dfs + 01字典树)
给定一个树,树上的边都具有权值. 树中一条路径的异或长度被定义为路径上所有边的权值的异或和: ⊕ 为异或符号. 给定上述的具有n个节点的树,你能找到异或长度最大的路径吗? 输入格式 第一行包含整数n, ...
随机推荐
- 原生js--鼠标事件
鼠标事件对象几个重要的属性: clientX 窗口坐标,加上垂直滚动可以得到文档纵坐标 clientY 窗口坐标,加上水平滚动可以得到文档横坐标 altKey boolean值,点击时是否按下了alt ...
- 关于kvm虚拟机的克隆方法总结
kvm虚拟机的克隆分为两种情况,第一种kvm宿主机上对虚拟机直接克隆 第二种通过复制配置文件与磁盘文件的虚拟机复制克隆(适用于异机的静态迁移). 现笔者将分别两种kvm虚拟机克隆的的详细操作过程都记录 ...
- 一个简单web系统的接口性能分析及调优过程
在测试一个简单系统接口性能压力时,压到一定数量,程序总是崩溃,查看相关机器相关数据时,CPU.内存.IO占用均不高,问题自然出现在其它地方先介绍下系统部件架构 Resin版本为:[root@local ...
- jfinal的model和record如何相互转化?
一.model转record: Model类: 1. /** * Convert model to record. */public Record toRecord() { return new Re ...
- Shell转义字符与变量替换
转义字符 含义 \\ 反斜杠 \a 警报,响铃 \b 退格(删除键) \f 换页(FF),将当前位置移到下页开头 \n 换行 \r 回车 \t 水平制表符(tab键) \v 垂直制表符 vim te ...
- PowerDesigner 把Comment/name 互转
转载:https://www.cnblogs.com/cxd4321/archive/2009/03/07/1405475.html 在使用PowerDesigner对数据库进行概念模型和物理模型设计 ...
- mysql5.5版本和mysql 5.6版本具体有哪些区别?
mysql5.6较5.5其中有一个很大的好处,比如给表加字段的时候,5.5或以前的版本会锁表,5.6就不会锁表,而且速度很快. MySQL 5.6 对默认配置进行了一些微调,这些调整大多数都非常不错, ...
- zoj 2676 Network Wars 0-1分数规划+最小割
题目详解出自 论文 Amber-最小割模型在信息学竞赛中的应用 题目大意: 给出一个带权无向图 G = (V,E), 每条边 e属于E都有一个权值We,求一个割边集C,使得该割边集的平均边权最小,即最 ...
- 1.0Tensorflow中出现编译问题的解决方案
跑简单tf例程的时候遇到这个 sess = tf.Session(),I tensorflow/core/platform/cpu_feature_guard.cc:] Your CPU suppor ...
- 要学习的UML图
这是人人都是产品经理里的一节内容,这是个简单的例子,我觉得重要就摘抄一下 UML是要好好学习的一门课程呀