[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:
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 计数相同值子树的个数