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

LeetCode 3820: Pythagorean Distance Nodes in a Tree

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

基本資料
#

難易度: medium 第一次嘗試:2026-01-25

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

解題思路
#

每個節點要知道它到 x、y、z 三個點的距離。與其對每個節點各做一次 BFS,不如從三個目標點各做一次 BFS,一次就得到所有節點到該目標的距離。

樹上兩點之間只有一條路徑,所以 BFS 的步數就是距離。

最後對每個節點,把三個距離排序,檢查 a² + b² == c²。

我的解法
#

from collections import deque

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

        def bfs(start):
            dist = [-1] * n
            dist[start] = 0
            q = deque([start])
            while q:
                u = q.popleft()
                for v in graph[u]:
                    if dist[v] == -1:
                        dist[v] = dist[u] + 1
                        q.append(v)
            return dist

        dx, dy, dz = bfs(x), bfs(y), bfs(z)

        count = 0
        for i in range(n):
            a, b, c = sorted((dx[i], dy[i], dz[i]))
            if a * a + b * b == c * c:
                count += 1
        return count

複雜度
#

時間 O(n):三次 BFS 加上一次掃描。空間 O(n)。

要特別避免的錯誤
#

  • 對每個節點都做 BFS,會變成 O(n^2)。
  • 只建單向邊:樹的邊是無向的。
  • 忘記排序:畢氏定理的 c 必須是最大的那個。

面試口說整理
#

我需要每個節點到三個目標點的距離,所以反過來從三個目標點各做一次 BFS,得到三個距離陣列。樹上路徑唯一,BFS 步數就是距離。接著對每個節點把三個距離排序,檢查兩個小的平方和是否等於最大的平方。總共三次 BFS,時間 O(n)。

相關文章

LeetCode 1306: Jump Game III
·1 分鐘
LeetCode Medium Bfs Dfs Graph Array
LeetCode 1306 解題筆記:每個 index 是節點、往左右跳是邊,BFS 或 DFS 看能不能走到值為 0 的位置
LeetCode 865: Smallest Subtree with all the Deepest Nodes
·1 分鐘
LeetCode Medium Tree Binary-Tree Bfs Dfs Lca
LeetCode 865 解題筆記:BFS 找最後一層再一起往上爬,或一次 DFS 回傳 (深度, 節點)
LeetCode 1161: Maximum Level Sum of a Binary Tree
·1 分鐘
LeetCode Medium Tree Binary-Tree Bfs
LeetCode 1161 解題筆記:把 None 放進下一層會多出一層假的總和 0
LeetCode 3619: Count Islands With Total Value Divisible by K
·2 分鐘
LeetCode Medium Dfs Bfs Matrix Graph
LeetCode 3619 解題筆記:網格 flood fill 加總每座島的值;格子到 10^5,用迭代避免遞迴太深
LeetCode 958: Check Completeness of a Binary Tree
·1 分鐘
LeetCode Medium Tree Binary-Tree Bfs
LeetCode 958 解題筆記:完整性是整體性質,用 BFS 檢查第一個空位之後還有沒有節點
LeetCode 1339: Maximum Product of Splitted Binary Tree
·1 分鐘
LeetCode Medium Tree Binary-Tree Dfs
LeetCode 1339 解題筆記:先算總和,再枚舉每棵子樹的和,不要改到輸入