📌  相关文章
📜  二叉树的两个叶子之间的最小和路径(1)

📅  最后修改于: 2023-12-03 15:06:20.002000             🧑  作者: Mango

二叉树的两个叶子之间的最小和路径

介绍

给出一棵二叉树,找到其中两个叶子节点之间的最小和路径。路径的和表示路径上所有节点的值之和。

示例

示例图

输入: [1,2,3,4,5]
      1
     / \
    2   3
   / \     
  4   5    
输出: 8
说明: 最小和路径为 4 + 1 + 3 = 8。
解法
递归

可以使用递归的方式,对于每个节点,计算它左右子树中路径长度之和最小的叶子节点的所有路径的长度,取其中的最小值,并加上经过该节点的路径长度(如果该节点是叶子节点,则直接返回0,否则返回它左右子树中路径长度之和最小的叶子节点的所有路径的长度)。

代码
class Solution:

    def min_leaf_path_sum(self, root: TreeNode) -> int:
        def dfs(node: TreeNode) -> Tuple[int,int]:
            if not node:
                return float('inf'), 0

            if not node.left and not node.right:
                return 0, node.val

            left_min_len, left_leaf_sum = dfs(node.left)
            right_min_len, right_leaf_sum = dfs(node.right)

            if left_min_len < right_min_len:
                min_len = left_min_len
                min_leaf_sum = left_leaf_sum
            elif left_min_len > right_min_len:
                min_len = right_min_len
                min_leaf_sum = right_leaf_sum
            else:
                min_len, min_leaf_sum = left_min_len, min(left_leaf_sum, right_leaf_sum)

            return min_len + 1, min_leaf_sum + node.val

        return dfs(root)[1]
复杂度
  • 时间复杂度:$O(n)$,其中 n 为树中节点个数,每个节点只会被访问一次。
  • 空间复杂度:$O(h)$,其中 h 为树的高度,递归调用时系统栈的深度为 h。