[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 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
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | # 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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | # 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++:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 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 计数相同值子树的个数
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步