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:

Note: The given binary tree has not more than 10000 nodes. The height of the tree is not more than 1000.

给一个二叉树,找出最长的相同值路径,与250. Count Univalue Subtrees类似。

解法:递归

Java:

class Solution {
public int longestUnivaluePath(TreeNode root) {
int[] res = new int[1];
if (root != null) dfs(root, res);
return res[0];
} private int dfs(TreeNode node, int[] res) {
int l = node.left != null ? dfs(node.left, res) : 0; // Longest-Univalue-Path-Start-At - left child
int r = node.right != null ? dfs(node.right, res) : 0; // Longest-Univalue-Path-Start-At - right child
int resl = node.left != null && node.left.val == node.val ? l + 1 : 0; // Longest-Univalue-Path-Start-At - node, and go left
int resr = node.right != null && node.right.val == node.val ? r + 1 : 0; // Longest-Univalue-Path-Start-At - node, and go right
res[0] = Math.max(res[0], resl + resr); // Longest-Univalue-Path-Across - node
return Math.max(resl, resr);
}
}

Python:

# Time: O(n)
# Space: O(n)
class Solution(object):
def longestUnivaluePath(self, root):
"""
:type root: TreeNode
:rtype: int
"""
longest = [0]
def traverse(node):
if not node:
return 0
left_len, right_len = traverse(node.left), traverse(node.right)
left = (left_len + 1) if node.left and node.left.val == node.val else 0
right = (right_len + 1) if node.right and node.right.val == node.val else 0
longest[0] = max(longest[0], left + right)
return max(left, right)
traverse(root)
return longest[0]

Python:

# Time:  O(n)
# Space: O(h)
class Solution(object):
def longestUnivaluePath(self, root):
"""
:type root: TreeNode
:rtype: int
"""
result = [0]
def dfs(node):
if not node:
return 0
left, right = dfs(node.left), dfs(node.right)
left = (left+1) if node.left and node.left.val == node.val else 0
right = (right+1) if node.right and node.right.val == node.val else 0
result[0] = max(result[0], left+right)
return max(left, right) dfs(root)
return result[0]

C++:

class Solution {
public:
int longestUnivaluePath(TreeNode* root) {
int lup = 0;
if (root) dfs(root, lup);
return lup;
} private:
int dfs(TreeNode* node, int& lup) {
int l = node->left ? dfs(node->left, lup) : 0;
int r = node->right ? dfs(node->right, lup) : 0;
int resl = node->left && node->left->val == node->val ? l + 1 : 0;
int resr = node->right && node->right->val == node->val ? r + 1 : 0;
lup = max(lup, resl + resr);
return max(resl, resr);
}
};

  

类似题目:

[LeetCode] 250. Count Univalue Subtrees 计数相同值子树的个数  

All LeetCode Questions List 题目汇总

最新文章

  1. 20155315庄艺霖--对做中学的理解及对c语言和Java的看法
  2. PHP去重算法的优化过程
  3. HTML实现简单计算器
  4. 传智播客--高级控件--showdialog关闭(小白内容)
  5. java实现二分查找
  6. hdu Farm Irrigation
  7. Dynamic CRM 2013学习笔记(四十)流程3 - 对话(Dialog)用法图解
  8. VS中的路径宏 vc++中OutDir、ProjectDir、SolutionDir各种路径 转
  9. LeetCode Subsets (DFS)
  10. spark结合 Openfire服务器,发送聊天消息
  11. CoreData的简单使用(二)数据的增删改查,轻量级的版本迁移
  12. php 登录实例演示
  13. Spring教程笔记(3) Bean
  14. Druid中配置双数据库
  15. 讲讲网络模块中加解密那点儿事--AES+BASE64
  16. 修复android 5.0 Xutils的框架问题retry error, curr request is null
  17. 3990 [模板]矩阵快速幂 洛谷luogu
  18. 洛谷P1638逛画展
  19. laravel 查询指定字段的值
  20. 使用shell数据处理数据实例①-------手把手教学版

热门文章

  1. JMeter压测时报“内存不足”故障的9个简单解决方案
  2. python测试开发django-rest-framework-65.序列化(ModelSerializer)
  3. 数组,字符串,json互相转换
  4. Alpha冲刺随笔九:第九天
  5. js元素remove
  6. Ubuntu 18.04 手动编译安装 ffmpeg
  7. [Codeforces 1242B]0-1 MST
  8. vue之大文件分段上传、断点续传
  9. pgloader 学习(八) pg 2 pg 简单demo
  10. Pollard-Rho算法求大数质因子