本题解采用了深度优先搜索(DFS)的方法来解决二叉树的最长交错路径问题。首先定义一个全局变量 `longest` 来存储目前找到的最长路径长度。接着,定义一个递归函数 `dfs` 来探索每个节点,该函数接受当前节点、当前路径的长度 `depth`,以及一个布尔值 `isLeft` 指示当前的方向(左或右)。函数中,首先更新 `longest` 为当前路径长度和 `longest` 的较大值。如果当前节点为 `None`,则直接返回。根据当前的方向,递归调用左子或右子节点,并调换方向。最后,从根节点的左子和右子开始分别调用 `dfs` 函数,初始化方向分别为左和右,以探索所有可能的交错路径。最终,返回 `longest` 作为结果。
时间复杂度: O(n)
空间复杂度: O(h)
# Definition for a binary tree node.
# 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: Optional[TreeNode]) -> int:
longest = 0 # 用于存储最长路径长度
def dfs(root, depth, isLeft):
nonlocal longest
longest = max(longest, depth) # 更新最长路径长度
if root is None:
return
if isLeft:
dfs(root.left, depth+1, False) # 向左走并改变方向
dfs(root.right, 0, True) # 从当前节点重新开始向右
else:
dfs(root.right, depth+1, True) # 向右走并改变方向
dfs(root.left, 0, False) # 从当前节点重新开始向左
dfs(root.right, 0, True) # 从根节点的右子开始向右的路径
dfs(root.left, 0, False) # 从根节点的左子开始向左的路径
return longest # 返回最长路径长度