📜  给定二叉树的最长直线路径长度(1)

📅  最后修改于: 2023-12-03 14:56:53.211000             🧑  作者: Mango

给定二叉树的最长直线路径长度

给定一棵二叉树,找到最长直线路径的长度。这里的直线路径指的是路径上的所有节点在同一条直线上。

解法

直线路径可以分为三种情况:

  1. 一条垂直于根节点到叶子节点的直线路径
  2. 一条水平的直线路径,连接左右子树
  3. 一条斜着的直线路径,连接左子树或右子树中的节点和祖先节点

我们可以通过递归解决这个问题。对于每个节点,我们可以计算其左右子节点到叶子节点的最长直线路径长度,从而计算出当前节点的最长直线路径长度。同时,我们还需要维护一个全局变量,来存储找到的最长直线路径长度。

代码
class Solution:
    def __init__(self):
        self.max_len = 0

    def longestZigZag(self, root: TreeNode) -> int:
        def dfs(node):
            if not node:
                return [-1, -1]  # 左子树和右子树到叶子节点的最长直线路径长度
            left_len, right_len = dfs(node.left), dfs(node.right)
            self.max_len = max(self.max_len, left_len[1] + 1, right_len[0] + 1)  # 更新全局变量
            return [left_len[1] + 1, right_len[0] + 1]

        dfs(root)
        return self.max_len
时间复杂度

在遍历每个节点时,我们需要计算其左右子节点到叶子节点的最长直线路径长度,时间复杂度为 $O(n)$,其中 n 是树的节点个数。因此,算法的总时间复杂度为 $O(n)$。

空间复杂度

在递归时,由于无法预知树的深度,我们需要对每个节点的左右子节点存储它们到叶子节点的最长直线路径长度,因此空间复杂度为 $O(n)$。