← 返回博客列表
DoorDash

DoorDash VO:二元樹兩「存活」節點間最大路徑和

2025-11-21

本文由 oavoservice 以面試復盤風格整理:給出題意澄清、可落地的狀態定義、邊界處理與可寫出來的程式碼模板。

題目(改寫版)

給定一棵二元樹,每個節點有整數權重。

路徑必須沿父子指標連續。

面試澄清點

Part A:alive = 葉子節點

這是經典「最大路徑和」變體,但端點必須是葉子。

思路

後序 DFS,返回:

u 處,如果左右子樹都存在(都能提供葉子),則可以用 down[left] + val[u] + down[right] 更新全域答案(葉子到葉子)。

複雜度

Python 程式碼模板

from math import inf

class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right


def max_leaf_to_leaf_sum(root: TreeNode) -> int:
    ans = -inf

    def dfs(node: TreeNode) -> int:
        nonlocal ans
        if not node:
            return -inf

        # 葉子:down 就是自己
        if not node.left and not node.right:
            return node.val

        left_down = dfs(node.left) if node.left else -inf
        right_down = dfs(node.right) if node.right else -inf

        # 如果兩側都存在葉子路徑,則可形成葉子-葉子
        if node.left and node.right:
            ans = max(ans, left_down + node.val + right_down)

        # down 必須走向存在的那一側
        return node.val + max(left_down, right_down)

    down_root = dfs(root)

    # 若整棵樹無法形成葉子-葉子(比如鏈狀樹),通常面試可約定返回 down_root 或者報錯。
    # 這裡選擇:若 ans 沒被更新,則返回 down_root(從根到某葉子的最大和)。
    return ans if ans != -inf else down_root

Part B:內部節點也可能 alive(路徑中間禁止出現 alive)

這題的關鍵是:路徑必須在兩端遇到 alive,中間不能經過 alive

狀態設計(可擴展)

後序 DFS,給每個節點返回兩類資訊:

轉移時:

程式碼模板(alive 集合作為輸入)

from math import inf


def max_alive_to_alive_sum(root: TreeNode, alive: set[TreeNode]) -> int:
    ans = -inf

    def dfs(node: TreeNode) -> int:
        nonlocal ans
        if not node:
            return -inf

        node_is_alive = node in alive

        left_best = dfs(node.left)
        right_best = dfs(node.right)

        # 如果當前節點是 alive:它只能作為端點,不能作為「中間」繼續向下連接
        if node_is_alive:
            ans = max(ans, node.val)  # 允許兩端點同一個點?按需調整
            return node.val

        # 當前節點不是 alive:可以把子樹裡的 alive 端點「往上帶」
        best_end = node.val + max(left_best, right_best)

        # 如果左右兩邊都各自能提供 alive 端點,則在這裡拼成 alive->alive
        if left_best != -inf and right_best != -inf:
            ans = max(ans, left_best + node.val + right_best)

        return best_end

    dfs(root)
    return ans

面試官常追問


如果你在準備 DoorDash / Snowflake / Google 等公司的 VO,我們在 oavoservice 會把這類「經典題的變體約束」訓練到能在 5 分鐘內說清狀態定義與邊界。


需要面試真題? 立刻聯繫微信 Coding0201獲得真題