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

LeetCode 236: Lowest Common Ancestor of a Binary Tree

·1 分鐘· ·
LeetCode Medium Tree Depth-First-Search Binary-Tree Binary-Lifting
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 → Accepted ×6

解題思路
#

一般二元樹沒有大小關係,要用遞迴的回傳值(Tree 模板四):

  • 走到 None、p 或 q 就回傳自己。
  • 左右子樹都回傳非空:p、q 分在兩邊,目前節點就是 LCA。
  • 只有一邊非空:答案在那一邊,往上傳。

我的嘗試
#

前兩版直接套用 LC 235 的 BST 寫法,用大小決定往左或往右,但一般二元樹沒有大小關係。例如 [8, 45, 61] 裡 p = 61、q = 45:答案是根 8,這版因為 8 比兩個都小,往右走了。改成遞迴回傳值的寫法就 AC 了。

正確解法
#

class Solution:
    def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
        if not root or root is p or root is q:
            return root
        left = self.lowestCommonAncestor(root.left, p, q)
        right = self.lowestCommonAncestor(root.right, p, q)
        if left and right:
            return root
        return left or right

複雜度
#

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

要特別避免的錯誤
#

  • 遇到 p 或 q 就可以直接回傳,不用再往下找:另一個如果在它下面,它本身就是 LCA。

面試口說整理
#

我用遞迴,遇到空節點、p 或 q 就回傳自己。左右兩邊都有回傳,代表在這裡分岔,目前節點就是 LCA;否則把有回傳的那一邊往上傳。時間 O(n)。

相關文章

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 337: House Robber III
·1 分鐘
LeetCode Medium Dynamic-Programming Tree Depth-First-Search Binary-Tree
LeetCode 337 解題筆記:樹上 DP,每個節點回傳(搶它、不搶它)的最大值;不是一層一層交錯搶
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 230: Kth Smallest Element in a BST
·1 分鐘
LeetCode Medium Tree Depth-First-Search Binary-Search-Tree Binary-Tree
LeetCode 230 解題筆記:BST 的中序遍歷是由小到大,迭代中序走到第 k 個就停