↓快轉到主要內容
  1. LeetCode/

LeetCode 3313: Find the Last Marked Nodes in Tree

·1 分鐘· ·
LeetCode Hard Tree Bfs Graph Tree-Diameter
Wei Yi Chung
作者
Wei Yi Chung
Working at the contributing of open source, distributed systems, and data engineering.
目錄

基本資料
#

難易度: hard 第一次嘗試:2026-09-17

  • 提交紀錄:Accepted(一次通過)

解題思路
#

從節點 i 開始,每秒把所有相鄰的點標記起來,這就是 BFS 擴散。最後被標記的點,就是離 i 最遠的點。

對每個點都做一次 BFS 是 O(n^2),n 到 10^5 會超時。

關鍵性質:對任何節點來說,樹的直徑兩端 u、v 之中,至少有一個是離它最遠的點。 所以只要:

  1. 從任意點 BFS 找到最遠點 u。
  2. 從 u BFS 找到最遠點 v,u、v 就是直徑的兩端。
  3. 再從 v BFS 一次。
  4. 對每個點 i,比較 dist_u[i] 和 dist_v[i],比較遠的那個端點就是答案。

我的解法
#

from collections import defaultdict, deque

class Solution:
    def lastMarkedNodes(self, edges: List[List[int]]) -> List[int]:
        n = len(edges) + 1
        adj = defaultdict(list)
        for u, v in edges:
            adj[u].append(v)
            adj[v].append(u)

        def bfs(start):
            dist = [-1] * n
            dist[start] = 0
            q = deque([start])
            while q:
                node = q.popleft()
                for nei in adj[node]:
                    if dist[nei] == -1:
                        dist[nei] = dist[node] + 1
                        q.append(nei)
            return node, dist                  # 最後彈出的就是最遠點

        u, _ = bfs(0)
        v, dist_u = bfs(u)
        _, dist_v = bfs(v)
        return [u if dist_u[i] > dist_v[i] else v for i in range(n)]

原本的版本把函式取名叫 dfs,但做的其實是 BFS,而且另外維護 farthest 這個 tuple。BFS 最後彈出的節點本來就是最遠的,可以直接回傳。

複雜度
#

三次 BFS,時間 O(n),空間 O(n)。

要特別避免的錯誤
#

  • 對每個點各跑一次 BFS,O(n^2) 超時。
  • 只從直徑的一端算距離:有些點離另一端比較遠。

面試口說整理
#

從 i 開始擴散標記,最後被標記的就是離 i 最遠的點。樹上任何點的最遠點,都可以取直徑的其中一端,所以我用兩次 BFS 找出直徑兩端 u、v,再從兩端各算一次距離,每個點選比較遠的那一端。三次 BFS,時間 O(n)。

相關文章

LeetCode 1377: Frog Position After T Seconds
·2 分鐘
LeetCode Hard Tree Dfs Bfs Graph Probability
LeetCode 1377 解題筆記:無向邊、seen 要記節點、提早到達目標時要看還能不能走
LeetCode 987: Vertical Order Traversal of a Binary Tree
·1 分鐘
LeetCode Hard Tree Binary-Tree Bfs Sorting
LeetCode 987 解題筆記:收集 (欄, 列, 值) 三元組,排序後依欄分組
LeetCode 2421: Number of Good Paths
·2 分鐘
LeetCode Hard Tree Union-Find Graph Sorting
LeetCode 2421 解題筆記:依值由小到大加入節點,用 Union-Find 數同一群裡同值的節點
LeetCode 3820: Pythagorean Distance Nodes in a Tree
·1 分鐘
LeetCode Medium Tree Bfs Graph
LeetCode 3820 解題筆記:三次 BFS 算出每個點到三個目標的距離
LeetCode 2608: Shortest Cycle in a Graph
·2 分鐘
LeetCode Hard Bfs Graph
LeetCode 2608 解題筆記:從每個點 BFS,遇到已拜訪而且不是 parent 的鄰居,就找到一個長度 dist[u] + dist[v] + 1 的環
LeetCode 2603: Collect Coins in a Tree
·2 分鐘
LeetCode Hard Tree Graph Topological-Sort
LeetCode 2603 解題筆記:先剪掉沒有硬幣的葉子,再固定剪兩層,剩下的邊走兩次