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

LeetCode 116: Populating Next Right Pointers in Each Node

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

基本資料
#

難易度: medium 第一次嘗試:2022-11-18

  • 提交紀錄:Runtime Error → Wrong Answer ×2 → Accepted → Wrong Answer → Runtime Error → Accepted ×2

解題思路
#

完美二元樹每個節點都有兩個小孩(除了葉子),所以下一層的連線只有兩種(Linked List「其他」、Tree 模板二):

  • 同一個父節點的兩個小孩:node.left.next = node.right。
  • 相鄰父節點之間:node.right.next = node.next.left。

上一層的 next 已經接好了,就可以沿著它走過整層,不用佇列。從最左邊的節點一層一層往下。

我的嘗試
#

前幾版是遞迴的寫法,但沒有回傳 root,例如只有一個節點 [8] 時回傳 None;有一版沒處理空樹。我當時 AC 的是遞迴版本(O(log n) 的遞迴深度),這裡改成沿著 next 走的迭代版。

正確解法
#

class Solution:
    def connect(self, root: 'Optional[Node]') -> 'Optional[Node]':
        leftmost = root
        while leftmost and leftmost.left:
            node = leftmost
            while node:                              # 沿著上一層的 next 走
                node.left.next = node.right
                if node.next:
                    node.right.next = node.next.left
                node = node.next
            leftmost = leftmost.left
        return root

複雜度
#

時間 O(n),額外空間 O(1)。

要特別避免的錯誤
#

  • 函式要回傳 root。
  • 這個寫法依賴「完美二元樹」,不完美的樹(LC 117)要另外處理缺少的小孩。

面試口說整理
#

完美二元樹的下一層只有兩種連線:同一個父節點的左右小孩,以及相鄰父節點之間右小孩接左小孩。我沿著上一層已經接好的 next 走,一層一層往下,不用佇列。時間 O(n)、額外空間 O(1)。

相關文章

LeetCode 1448: Count Good Nodes in Binary Tree
·1 分鐘
LeetCode Medium Tree Depth-First-Search Breadth-First-Search Binary-Tree
LeetCode 1448 解題筆記:DFS 往下傳路徑上的最大值,節點的值大於等於它就是好節點
LeetCode 199: Binary Tree Right Side View
·1 分鐘
LeetCode Medium Tree Depth-First-Search Breadth-First-Search Binary-Tree
LeetCode 199 解題筆記:層序遍歷,每一層最右邊的節點就是從右邊看得到的
LeetCode 113: Path Sum II
·1 分鐘
LeetCode Medium Backtracking Tree Depth-First-Search Binary-Tree
LeetCode 113 解題筆記:回溯記錄目前的路徑,到葉子時總和等於目標就存一份複本;值可能是負的,不能提早剪枝
LeetCode 129: Sum Root to Leaf Numbers
·1 分鐘
LeetCode Medium Tree Depth-First-Search Binary-Tree
LeetCode 129 解題筆記:往下走時目前的數字乘 10 加上節點的值,到葉子時加進總和
LeetCode 236: Lowest Common Ancestor of a Binary Tree
·1 分鐘
LeetCode Medium Tree Depth-First-Search Binary-Tree Binary-Lifting
LeetCode 236 解題筆記:遞迴回傳子樹裡找到的 p 或 q;左右都找到代表在這裡分岔,這個節點就是 LCA
LeetCode 337: House Robber III
·1 分鐘
LeetCode Medium Dynamic-Programming Tree Depth-First-Search Binary-Tree
LeetCode 337 解題筆記:樹上 DP,每個節點回傳(搶它、不搶它)的最大值;不是一層一層交錯搶