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

LeetCode 3787: Find Diameter Endpoints of a Tree

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

基本資料
#

難易度: medium 第一次嘗試:2026-10-22

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

解題思路
#

要標出所有「某條直徑的端點」。直徑可能有很多條,不能只找一條。

先用兩次 BFS 找到一條直徑(Tree 模板五):

  1. 從任意點(0)BFS,最遠的點 A 一定是某條直徑的端點。
  2. 從 A BFS,最遠的點 B 是另一端,dist(A, B) 就是直徑長度 D。

關鍵性質:樹上任何一個點,離它最遠的點一定可以取 A 或 B。所以節點 i 的最遠距離是 max(dist(A, i), dist(B, i))。

節點 i 是某條直徑的端點,等於它的最遠距離剛好是 D。所以從 A、B 各 BFS 一次,檢查 max(dA[i], dB[i]) == D 就好。

我的嘗試
#

一次通過。

正確解法
#

class Solution:
    def findSpecialNodes(self, n: int, edges: List[List[int]]) -> str:
        graph = [[] for _ in range(n)]
        for u, v in edges:
            graph[u].append(v)
            graph[v].append(u)

        def bfs(s):
            dist = [-1] * n
            dist[s] = 0
            queue = deque([s])
            while queue:
                node = queue.popleft()
                for nei in graph[node]:
                    if dist[nei] < 0:
                        dist[nei] = dist[node] + 1
                        queue.append(nei)
            return dist

        d0 = bfs(0)
        a = d0.index(max(d0))
        dA = bfs(a)
        b = dA.index(max(dA))
        dB = bfs(b)
        diameter = dA[b]
        return "".join("1" if max(dA[i], dB[i]) == diameter else "0" for i in range(n))

複雜度
#

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

要特別避免的錯誤
#

  • 直徑不唯一,只標 A、B 兩個點會漏掉其他直徑的端點。
  • 只有一個節點時直徑是 0,那個點自己就是端點,公式也成立。

面試口說整理
#

我先兩次 BFS 找到一條直徑的兩端 A、B 和長度 D。樹上任一點最遠的點一定可以是 A 或 B,所以一個點的最遠距離是它到 A、B 距離的較大值;這個值等於 D 的點就是某條直徑的端點。總共三次 BFS,時間 O(n)。

相關文章

LeetCode 314: Binary Tree Vertical Order Traversal
·1 分鐘
LeetCode Medium Hash-Table Tree Depth-First-Search Breadth-First-Search Sorting Binary-Tree
LeetCode 314 解題筆記:BFS 帶著欄位編號,用 BFS 才能保證同一欄由上到下、同一列由左到右
LeetCode 116: Populating Next Right Pointers in Each Node
·1 分鐘
LeetCode Medium Linked-List Tree Depth-First-Search Breadth-First-Search
LeetCode 116 解題筆記:完美二元樹,用上一層已經接好的 next 走過這一層:left.next = right,right.next = next.left;O(1) 額外空間
LeetCode 117: Populating Next Right Pointers in Each Node II
·1 分鐘
LeetCode Medium Linked-List Tree Depth-First-Search Breadth-First-Search Binary-Tree
LeetCode 117 解題筆記:BFS 一層一層接 next;不是完全二元樹時,只看隔壁節點的小孩會斷掉
LeetCode 133: Clone Graph
·1 分鐘
LeetCode Medium Hash-Table Depth-First-Search Breadth-First-Search Graph
LeetCode 133 解題筆記:DFS 時用雜湊表記住舊節點對應的新節點,遇到已經複製過的就直接回傳,避免無限遞迴;空圖回傳 None
LeetCode 102: Binary Tree Level Order Traversal
·1 分鐘
LeetCode Medium Tree Breadth-First-Search Binary-Tree
LeetCode 102 解題筆記:BFS 一次處理一整層,用目前這層的節點產生下一層;空樹回傳空 list
LeetCode 1448: Count Good Nodes in Binary Tree
·1 分鐘
LeetCode Medium Tree Depth-First-Search Breadth-First-Search Binary-Tree
LeetCode 1448 解題筆記:DFS 往下傳路徑上的最大值,節點的值大於等於它就是好節點