1372. 二叉树中的最长交错路径 - 力扣(LeetCode)




可以使用深度优先搜索(DFS)来遍历二叉树,并计算每个节点开始的最长交错路径。我们需要在递归过程中跟踪当前方向(左或右),以及已访问的节点数。以下是实现方案:
解题思路
-
定义DFS函数:
- 以当前节点为起点,递归计算其左子树和右子树的最长交错路径。
- 递归时记录当前方向(左或右)。
- 每次递归时,如果前进方向为左,则下次前进方向改为右;反之亦然。
- 记录全局最大交错路径。
-
初始调用:
- 由于交错路径可以从任意节点开始,我们从
root开始分别向左、向右递归,取最大值。
- 由于交错路径可以从任意节点开始,我们从
代码实现
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
class Solution:
def longestZigZag(self, root: TreeNode) -> int:
self.max_length = 0 # 记录最长交错路径
def dfs(node, is_left, length):
if not node:
return
self.max_length = max(self.max_length, length)
if is_left:
dfs(node.left, False, length + 1) # 改变方向,向左走
dfs(node.right, True, 1) # 重新开始,向右走
else:
dfs(node.right, True, length + 1) # 改变方向,向右走
dfs(node.left, False, 1) # 重新开始,向左走
# 从根节点分别尝试向左和向右
dfs(root.left, False, 1) # 从根节点的左子树开始,方向为左
dfs(root.right, True, 1) # 从根节点的右子树开始,方向为右
return self.max_length
复杂度分析
- 时间复杂度:O(N),其中 N 是树中的节点数,每个节点被访问一次。
- 空间复杂度:O(H),其中 H 是树的高度,递归的最大深度不会超过 H。
示例
输入
root = TreeNode(1)
root.right = TreeNode(1)
root.right.left = TreeNode(1)
root.right.right = TreeNode(1)
root.right.left.right = TreeNode(1)
root.right.left.right.left = TreeNode(1)
root.right.left.right.right = TreeNode(1)
sol = Solution()
print(sol.longestZigZag(root))
输出
3
该代码能高效计算二叉树中的最长交错路径。🚀
284

被折叠的 条评论
为什么被折叠?



