付費限定

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

更新於 2024/05/29閱讀時間約 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)。

空間複雜度:

從根結點開始,探索整顆樹,遞迴深度最深為n,發生在整顆樹向左歪斜或向右歪斜的時候,所需recursion call stack最深為O(n)。

以行動支持創作者!付費即可解鎖
本篇內容共 2093 字、1 則留言,僅發佈於Leetcode精選75題 解析+統整你目前無法檢視以下內容,可能因為尚未登入,或沒有該房間的查看權限。
avatar-img
90會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
題目敘述 題目會給我們一顆二元樹的根節點。請問在這棵樹中,之字型走法的路徑長度最大值是多少? 如果無解,請返回 零。 註: 之字型走法就是有一段路徑,都是由連續的 左右左右...,或者 右左右左...所構成的路徑。(看下方的測試範例會更清楚題目的定義) 題目的原文敘述 測試範例 E
題目敘述 題目會給定一顆二元樹的根結點Root node,和指定的目標值targetSum。 問我們能不能從二元樹裡面找到一條從根結點到葉子結點的路徑,其路徑上的節點值總和恰好為targetSum? 可以的話,返回True。 無解的話,返回False。 題目的原文敘述 測試範例 E
題目敘述 題目會給定兩顆二元樹的根結點,要求我們判斷這兩顆二元樹是否為 葉子相似樹? 葉子相似樹的定義 兩顆二元樹,從左到右看的葉子結點的序列完全相同。 例如下圖中的這兩顆二元樹,從左到右看的葉子結點的序列 = [6, 7, 4, 9, 8] 完全相同。 題目的原文敘述 測試範例
題目敘述 題目會給定一個二元樹的樹根結點Root node,要求我們計算這顆二元樹的最大深度是多少? 二元樹的深度的定義: 從根結點到葉子結點的最大路徑長度。 題目的原文敘述 約束條件 Constraints: The number of nodes in the tree is
題目敘述 題目會給我們一個輸入陣列arr,起始點固定在索引為0的位置, 終點固定在索引為n-1的位置。 假設當下所在的索引位置為i,那麼每次移動的時候,可以跳到i-1,i+1,或者其他和我有相同元素值的位置arr[j], where arr[j] = arr[i]。 例如: 假設當下在i=3
題目敘述 題目會給我們一個輸入陣列nums,每個元素值代表那個格子點可以左右位移的固定長度。 例如,假設 nums[i] = 3,那麼下一步可以移動到nums[i-3] 或 nums[i+3]這兩個格子點。 題目​會給定一個起始點start索引位置,請問我們能不能走到內部數值為0的格子點?
題目敘述 題目會給我們一顆二元樹的根節點。請問在這棵樹中,之字型走法的路徑長度最大值是多少? 如果無解,請返回 零。 註: 之字型走法就是有一段路徑,都是由連續的 左右左右...,或者 右左右左...所構成的路徑。(看下方的測試範例會更清楚題目的定義) 題目的原文敘述 測試範例 E
題目敘述 題目會給定一顆二元樹的根結點Root node,和指定的目標值targetSum。 問我們能不能從二元樹裡面找到一條從根結點到葉子結點的路徑,其路徑上的節點值總和恰好為targetSum? 可以的話,返回True。 無解的話,返回False。 題目的原文敘述 測試範例 E
題目敘述 題目會給定兩顆二元樹的根結點,要求我們判斷這兩顆二元樹是否為 葉子相似樹? 葉子相似樹的定義 兩顆二元樹,從左到右看的葉子結點的序列完全相同。 例如下圖中的這兩顆二元樹,從左到右看的葉子結點的序列 = [6, 7, 4, 9, 8] 完全相同。 題目的原文敘述 測試範例
題目敘述 題目會給定一個二元樹的樹根結點Root node,要求我們計算這顆二元樹的最大深度是多少? 二元樹的深度的定義: 從根結點到葉子結點的最大路徑長度。 題目的原文敘述 約束條件 Constraints: The number of nodes in the tree is
題目敘述 題目會給我們一個輸入陣列arr,起始點固定在索引為0的位置, 終點固定在索引為n-1的位置。 假設當下所在的索引位置為i,那麼每次移動的時候,可以跳到i-1,i+1,或者其他和我有相同元素值的位置arr[j], where arr[j] = arr[i]。 例如: 假設當下在i=3
題目敘述 題目會給我們一個輸入陣列nums,每個元素值代表那個格子點可以左右位移的固定長度。 例如,假設 nums[i] = 3,那麼下一步可以移動到nums[i-3] 或 nums[i+3]這兩個格子點。 題目​會給定一個起始點start索引位置,請問我們能不能走到內部數值為0的格子點?
你可能也想看
Google News 追蹤
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
因最近看到又有人討論起推背圖後,我不禁回想去過去台灣這邊也是拿推背圖來說誰當選。 所以整理一下過去對於推背圖的一些瞭解,重新解剖一下解讀的走向。 首先要先弄清楚推背圖的規律,我整頓完思緒後基本上可以歸納幾點。 1.此預言是描述[中國大陸的最大勢力],所以如今的現在,描述的只會是[中共國],而非[中華
Thumbnail
跟外川第一次的意見不合就如此慘痛,野末從沒想過會是這種發展,也讓他深刻體驗到外川竟如此強勢(這就是年下攻嗎?)
Thumbnail
被譽為矽谷創業教父的史蒂芬.布蘭克(Steve Blank)在這篇文章中,概述了精實創業的方法與發展過程,以及說明當精實創業結合其他商業趨勢後,將如何引發一波新的創業經濟。
Thumbnail
-> 這篇在說什麼 這篇文章提供一個科目圖的視角來分析科系,每個學生可以依照自己喜歡的工作,來反推出需要學習的科目,進而反推出選這科系的成本效益值 此篇也會leverage這科目圖工具去解除一些大家的誤解/盲點 出路廣的科系就是好科系? 是否有盲點? 出路廣的科系還有分類? 前言 如何判斷?
Thumbnail
本章重點: 介紹一個比布萊克史奈德在《先讓英雄救貓咪》提出的十五步驟架構表更好用的三幕劇本檢視法則:悲劇/喜劇故事曲線圖
Thumbnail
平常有些細節都會被我們省略,想想看: 你穿襪子,是先穿左腳還是右腳? 你刷牙,是先刷左邊還是右邊? 你上完大號,是先拿衛生紙擦屁股,還是先沖馬桶? 撲克牌裡,哪一張人頭是獨眼? 蒙娜麗莎的微笑,是左手壓在右手上,還是右手壓在左手上?... -追蹤、訂閱《郝廣才日日談》來閱讀全文,每天為你說一個故事。
Thumbnail
有些重要的資訊看數字看不出來,那要看什麼?看圖。 亞伯拉罕.沃爾德(Abraham Wald)是一個在美國哥倫比亞大學任教的統計學教授,他在1943年二次大戰中,因為一張圖,救了無數飛行員的生命... -追蹤、訂閱《郝廣才日日談》來閱讀全文,每天為你說一個故事。
Thumbnail
 最近接觸一位熱愛八九十年代流行歌曲的小學生,他在言談間也不時哼起一兩句,使我不期然想起小時候的自己。  香江小故事 「I, I, I was born in Beijing,不知命運是誰定。」黎天
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
因最近看到又有人討論起推背圖後,我不禁回想去過去台灣這邊也是拿推背圖來說誰當選。 所以整理一下過去對於推背圖的一些瞭解,重新解剖一下解讀的走向。 首先要先弄清楚推背圖的規律,我整頓完思緒後基本上可以歸納幾點。 1.此預言是描述[中國大陸的最大勢力],所以如今的現在,描述的只會是[中共國],而非[中華
Thumbnail
跟外川第一次的意見不合就如此慘痛,野末從沒想過會是這種發展,也讓他深刻體驗到外川竟如此強勢(這就是年下攻嗎?)
Thumbnail
被譽為矽谷創業教父的史蒂芬.布蘭克(Steve Blank)在這篇文章中,概述了精實創業的方法與發展過程,以及說明當精實創業結合其他商業趨勢後,將如何引發一波新的創業經濟。
Thumbnail
-> 這篇在說什麼 這篇文章提供一個科目圖的視角來分析科系,每個學生可以依照自己喜歡的工作,來反推出需要學習的科目,進而反推出選這科系的成本效益值 此篇也會leverage這科目圖工具去解除一些大家的誤解/盲點 出路廣的科系就是好科系? 是否有盲點? 出路廣的科系還有分類? 前言 如何判斷?
Thumbnail
本章重點: 介紹一個比布萊克史奈德在《先讓英雄救貓咪》提出的十五步驟架構表更好用的三幕劇本檢視法則:悲劇/喜劇故事曲線圖
Thumbnail
平常有些細節都會被我們省略,想想看: 你穿襪子,是先穿左腳還是右腳? 你刷牙,是先刷左邊還是右邊? 你上完大號,是先拿衛生紙擦屁股,還是先沖馬桶? 撲克牌裡,哪一張人頭是獨眼? 蒙娜麗莎的微笑,是左手壓在右手上,還是右手壓在左手上?... -追蹤、訂閱《郝廣才日日談》來閱讀全文,每天為你說一個故事。
Thumbnail
有些重要的資訊看數字看不出來,那要看什麼?看圖。 亞伯拉罕.沃爾德(Abraham Wald)是一個在美國哥倫比亞大學任教的統計學教授,他在1943年二次大戰中,因為一張圖,救了無數飛行員的生命... -追蹤、訂閱《郝廣才日日談》來閱讀全文,每天為你說一個故事。
Thumbnail
 最近接觸一位熱愛八九十年代流行歌曲的小學生,他在言談間也不時哼起一兩句,使我不期然想起小時候的自己。  香江小故事 「I, I, I was born in Beijing,不知命運是誰定。」黎天