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

LeetCode 863: All Nodes Distance K in Binary Tree

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

基本資料
#

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

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

解題思路
#

距離 k 的節點可能在 target 的子樹裡,也可能要先往上走到祖先再往下。樹只有往下的指標,所以先把它轉成無向圖(Tree 模板五):DFS 一遍,每條父子邊兩個方向都記下來。節點的值都不同,可以直接用值當圖的節點。

接著從 target 做 BFS,第 k 層的節點就是答案。

我的嘗試
#

一次通過。

正確解法
#

class Solution:
    def distanceK(self, root: TreeNode, target: TreeNode, k: int) -> List[int]:
        adj = defaultdict(list)

        def dfs(node):
            for child in (node.left, node.right):
                if child:
                    adj[node.val].append(child.val)
                    adj[child.val].append(node.val)
                    dfs(child)

        dfs(root)
        seen = {target.val}
        level = [target.val]
        for _ in range(k):
            nxt = []
            for node in level:
                for nei in adj[node]:
                    if nei not in seen:
                        seen.add(nei)
                        nxt.append(nei)
            level = nxt
        return level

我當時的寫法是在 pop 時才檢查 seen、dist > k 就停,結果一樣;上面這個版本在放進佇列時就標記,同一個節點不會重複進佇列。

複雜度
#

時間 O(n),空間 O(n)。

要特別避免的錯誤
#

  • 只往下找會漏掉要經過父節點的那些節點。
  • BFS 要記 seen,無向圖會走回頭路。
  • 也可以只記 parent 指標,不用建完整的鄰接表。

面試口說整理
#

距離 k 的節點可能要先往上走,所以我先 DFS 把樹轉成無向圖,每條父子邊都加兩個方向。然後從 target 做 BFS,用 seen 避免走回頭,走 k 層之後佇列裡的節點就是答案。時間、空間都是 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 652: Find Duplicate Subtrees
·1 分鐘
LeetCode Medium Hash-Table Tree Depth-First-Search Binary-Tree
LeetCode 652 解題筆記:後序把每棵子樹編碼,出現第二次時加入答案;字串編碼最差 O(n^2),改成 (值, 左 id, 右 id) 編號可到 O(n)
LeetCode 449: Serialize and Deserialize BST
·1 分鐘
LeetCode Medium String Tree Depth-First-Search Breadth-First-Search Design Binary-Search-Tree Binary-Tree
LeetCode 449 解題筆記:BST 只要存前序,不用空節點標記;反序列化帶著上下界遞迴,O(n)
LeetCode 515: Find Largest Value in Each Tree Row
·1 分鐘
LeetCode Medium Tree Depth-First-Search Breadth-First-Search Binary-Tree
LeetCode 515 解題筆記:BFS 層序遍歷,每層取最大值;初始值用 -inf
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 1448: Count Good Nodes in Binary Tree
·1 分鐘
LeetCode Medium Tree Depth-First-Search Breadth-First-Search Binary-Tree
LeetCode 1448 解題筆記:DFS 往下傳路徑上的最大值,節點的值大於等於它就是好節點