【Leetcode解題】236. Lowest Common Ancestor of a Binary Tree
題目
解題概念
- 此題簡單來說,就是給定兩個節點
p與q,找出他們的 Lowest Common Ancestor (LCA;最低共同祖先)- LCA 定義 : 可參考此網頁
- 此題共有兩種解法,一種是遞迴的方式,另一種是用迭代與 DFS 的方式,而我此次採用第一種方式
- 實際執行上,遞迴的判斷條件有兩種 :
- 若
p與q分別在root的兩側,則他們的 LCA 就是root - 若
p與q在root的同一側,則他們的 LCA 是這兩個節點中最低的節點
- 若
- 而遞迴的終止條件有兩種 :
root為None: 回傳root即可root剛好是p或q: 回傳root
實際寫Code
- 目標函式 :
lowestCommonAncestor(root, p, q)- 節點格式 :
1
2
3
4
5class TreeNode(object):
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right - Input :
root: TreeNode、p: TreeNode、q: TreeNode - Output :
TreeNode
- 節點格式 :
- 主要遞迴 :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16# 遞迴的兩種終止條件
if root == None or root == p or root == q :
return root
# 獲得左子樹的 LCA
left = self.lowestCommonAncestor(root.left, p, q)
# 獲得右子樹的 LCA
right = self.lowestCommonAncestor(root.right, p, q)
# 遞迴判斷條件 Case 1 : p 與 q 在不同側
if left and right :
return root
# 遞迴判斷條件 Case 2 : p 與 q 在同側
return left if left else right
參考資料
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Robin's Tech Blog!


