返回
力挽狂澜 687_最长同值路径: 难不倒我的技术难点
前端
2023-10-27 07:04:54
力挽狂澜 687_最长同值路径: 难不倒我的技术难点
缘起
俗话说得好,看一百遍美女,美女也不一定是你的。但你刷一百遍算法,知识就是你的了~~ 谁能九层台,不用累土起!
今天给大家带来一道算法题——687_最长同值路径,这道题不仅能考察你的编程能力,更能磨炼你的思维逻辑。快来跟我一起攻克难关吧!
题目地址
题目
给定一个二叉树的 root,返回 最长的路径的长度 ,这个路径中的 每个节点具有相同 的值。这条路径可以经过任何节点,但不能经过同一个节点两次。
示例 1:
输入:root = [5,4,5,1,1,5]
输出:2
5
/ \
4 5
/ \ \
1 1 5
示例 2:
输入:root = [1,4,5,4,4,5]
输出:2
1
/ \
4 5
/ \ \
4 4 5
提示:
- 树中节点的数目范围是[0, 10^4]
- -1000 <= Node.val <= 1000
解题思路
这道题的解法有很多种,我们可以采用递归或者深度优先搜索的方法来解决。
递归
def longestUnivaluePath(root):
if not root:
return 0
left = longestUnivaluePath(root.left)
right = longestUnivaluePath(root.right)
if root.left and root.left.val == root.val:
left += 1
else:
left = 0
if root.right and root.right.val == root.val:
right += 1
else:
right = 0
return max(left + right, longestUnivaluePath(root.left), longestUnivaluePath(root.right))
深度优先搜索
def longestUnivaluePath(root):
max_path = 0
def dfs(node):
if not node:
return 0
left_path = dfs(node.left)
right_path = dfs(node.right)
if node.left and node.left.val == node.val:
left_path += 1
else:
left_path = 0
if node.right and node.right.val == node.val:
right_path += 1
else:
right_path = 0
max_path = max(max_path, left_path + right_path)
return max(left_path, right_path)
dfs(root)
return max_path
复杂度分析
- 时间复杂度:O(N),其中 N 是树中的节点数。
- 空间复杂度:O(N),递归调用需要额外的空间来存储栈帧。
结语
算法题的魅力就在于此,它不仅能考察我们的编程能力,更能磨炼我们的思维逻辑。希望大家能多刷题,不断提升自己的技术水平。