圖論經典: 二元樹中的最接近公共祖先節點 LCA of a Binary_Leetcode #236 精選75題

2024/01/30閱讀時間約 5 分鐘

題目敘述

題目會給定一顆二元樹的根結點Root node,和這棵樹中的任意兩個節點p, q。

找出p, q 在這棵二元數裡面的最接近公共祖先節點是誰?

最接近的公共節點: 就是p, q兩個節點從下往上走,第一個交會的節點。

題目的原文敘述


測試範例

Example 1:

raw-image
Input: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
Output: 3
Explanation: The LCA of nodes 5 and 1 is 3.

節點5和節點1的公最接近公共節點是 節點3

Example 2:

raw-image
Input: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4
Output: 5
Explanation: The LCA of nodes 5 and 4 is 5, since a node can be a descendant of itself according to the LCA definition.
節點5和節點4的公最接近公共節點是 節點5

Example 3:

Input: root = [1,2], p = 1, q = 2
Output: 1
節點1和節點2的公最接近公共節點是 節點1

演算法 討論可能的情況,並且分類。使用DFS深度優先搜索

假如從樹根Root node開始往下搜索的話,會有下列幾種情況。

  1. 空節點、或 空樹,一定不可能是別人的共同祖先,返回None。
  2. 現在這個節點剛好是p 或者 剛好是q,返回當下這個節點。
  3. p, q 都落在右子樹(root.right)裡面,遞回去右子樹裡面找。
  4. p, q 都落在左子樹(root.left)裡面,遞回去左子樹裡面找。
  5. p, q 剛好其中一個在左子樹裡面,另一個在右子樹裡面,那麼,當下的root node剛好就是最接近公共祖先節點
最接近的公共節點: 就是p, q兩個節點從下往上走第一個交會的節點

程式碼 討論可能的情況,並且分類。使用DFS深度優先搜索

class Solution:
def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':

if not root:
# Empty tree or empty node
return None

if root is p or root is q:
# Current node is either p or q
return root

left = self.lowestCommonAncestor(root.left, p, q)
right = self.lowestCommonAncestor(root.right, p, q)

if not left:
# Both p, q reside in right subtree
return right
elif not right:
# Both p, q reside in left subtree
return left
else:
# One reside in left subtree, the other reside in right subtree
# Current root node is Lowest Common Ancestor of (p, q)
return root

複雜度分析 討論可能的情況,並且分類。使用DFS深度優先搜索

時間複雜度:

從根結點開始,探索整顆樹,每個結點最多拜訪一次,所需時間為O(n)。

空間複雜度:

以行動支持創作者!付費即可解鎖
本篇內容共 2106 字、0 則留言,僅發佈於Leetcode 精選75題 上機考面試題 詳解你目前無法檢視以下內容,可能因為尚未登入,或沒有該房間的查看權限。
45會員
288內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
發表第一個留言支持創作者!