圖論應用題: 樹的路徑總和 Path Sum_Leetcode #112

閱讀時間約 7 分鐘


題目敘述

題目會給定一顆二元樹的根結點Root node,和指定的目標值targetSum。

問我們能不能從二元樹裡面找到一條從根結點到葉子結點的路徑,其路徑上的節點值總和恰好為targetSum?

可以的話,返回True。

無解的話,返回False。


題目的原文敘述


測試範例

Example 1:

raw-image
Input: root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22
Output: true
Explanation: The root-to-leaf path with the target sum is shown.

Example 2:

raw-image
Input: root = [1,2,3], targetSum = 5
Output: false
Explanation: There two root-to-leaf paths in the tree:
(1 --> 2): The sum is 3.
(1 --> 3): The sum is 4.
There is no root-to-leaf path with sum = 5.

Example 3:

Input: root = [], targetSum = 0
Output: false
Explanation: Since the tree is empty, there are no root-to-leaf paths.

請注意,空樹對應到的是無解喔,要返回False

約束條件

Constraints:

  • The number of nodes in the tree is in the range [0, 5000].

結點總數目介於0~5000之間。

請留意邊界條件的處理,題目有可能給我們一顆空樹

  • -1000 <= Node.val <= 1000

節點值都介於 負一千 ~ 正一千之間。

  • -1000 <= targetSum <= 1000

目標值targetSum 一定介於 負一千 ~ 正一千 之間。


演算法

題目已經說從二元樹裡面,看看能不能找到一條從根結點到葉子結點的路徑,其路徑上的節點值總和恰好為targetSum?

那就順著題意走從Root node根結點出發,從上往下走,每經過一個節點,就把targetSum減去對應的結點值node.val,假如到葉子結點的時候,targetSum剛好扣完,那就表示有解,返回True

否則,假如都找不到,代表無解,返回False。


程式碼 DFS從上到下深度優先搜索每個結點

class Solution:
def hasPathSum(self, root: Optional[TreeNode], targetSum: int) -> bool:

## Base case: Empty tree or empty node
if not root:
return False

## Base case
if not root.left and not root.right:

# we have the path with targetSum
return targetSum == root.val

## General case:
return self.hasPathSum(root.left, targetSum - root.val) or \
self.hasPathSum(root.right, targetSum - root.val)

複雜度分析 DFS從上到下深度優先搜索每個結點

時間複雜度:

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

空間複雜度:

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


程式碼 BFS從上到下 廣度優先,逐層往下探索每個結點

class Solution:
def hasPathSum(self, root: Optional[TreeNode], targetSum: int) -> bool:

# Base case: empty tree
if not root:
return False

# BFS Queue, starting from root node with given targetSum
bfs_q = deque([ (root, targetSum)])

# Launch BFS aka level-order traversal from root node
while bfs_q:

cur, target = bfs_q.popleft()

# We've reached leaf node, and my value equals to target value
if not cur.left and not cur.right and target == cur.val:
return True

# Update target value for next level
target -= cur.val

# Push children into BFS queue
cur.left and bfs_q.append( (cur.left, target) )
cur.right and bfs_q.append( (cur.right, target) )

return False

複雜度分析 BFS從上到下 廣度優先,逐層往下探索每個結點

時間複雜度:

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

空間複雜度:

從根結點開始,探索整顆樹,BFS Queue長度最長為O(n/2),發生最後一層而且樹全滿的時候,所需空間最大為O(n/2) = O(n) 係數可省略。


關鍵知識點

順著題意走從Root node根結點出發,從上往下走,每經過一個節點,就把targetSum減去對應的結點值node.val,假如到葉子結點的時候,targetSum剛好扣完,那就表示有解,返回True

否則,代表無解,返回False。


Reference:

[1] Path Sum_Python O(n) DFS solution

[2] Path Sum_Python O(n) BFS solution

86會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
發表第一個留言支持創作者!
題目敘述 題目會給定兩顆二元樹的根結點,要求我們判斷這兩顆二元樹是否為 葉子相似樹? 葉子相似樹的定義 兩顆二元樹,從左到右看的葉子結點的序列完全相同。 例如下圖中的這兩顆二元樹,從左到右看的葉子結點的序列 = [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的格子點?
題目敘述 題目會給我們一個輸入陣列nums,每個元素值代表那個格子點可以跳躍的最大長度。 題目保證始從最左邊的格子點出發開始跳,一定可以成功抵達終點,請問最少跳躍次數是說少? 題目的原文敘述 測試範例 Example 1: Input: nums = [2,3,1,1,4] Outp
題目敘述 題目會給我們一個輸入陣列nums,每個元素值代表那個格子點可以跳躍的最大長度。 一開始從最左邊的格子點出發開始跳,請問可以成功抵達終點,也就是最右邊的格子點嗎? 如果可以,返回 True。 如果不行,返回False。 題目的原文敘述 測試範例 Example 1: In
題目敘述 題目會給定兩顆二元樹的根結點,要求我們判斷這兩顆二元樹是否為 葉子相似樹? 葉子相似樹的定義 兩顆二元樹,從左到右看的葉子結點的序列完全相同。 例如下圖中的這兩顆二元樹,從左到右看的葉子結點的序列 = [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的格子點?
題目敘述 題目會給我們一個輸入陣列nums,每個元素值代表那個格子點可以跳躍的最大長度。 題目保證始從最左邊的格子點出發開始跳,一定可以成功抵達終點,請問最少跳躍次數是說少? 題目的原文敘述 測試範例 Example 1: Input: nums = [2,3,1,1,4] Outp
題目敘述 題目會給我們一個輸入陣列nums,每個元素值代表那個格子點可以跳躍的最大長度。 一開始從最左邊的格子點出發開始跳,請問可以成功抵達終點,也就是最右邊的格子點嗎? 如果可以,返回 True。 如果不行,返回False。 題目的原文敘述 測試範例 Example 1: In
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
Thumbnail
  回想起剛從機械系畢業時,我懂得怎麼計算,也熟悉各種機械理論。但真正要自己設計時,卻只能朦朧應用,可以說是亂兜各種機件,最後拼出了一個四不像的奇怪機構。   而十年後的現在,對機構學的熱情讓我始終從事「能應用『動力機構』」的工作。看過許多機械構造也自己鑽研許多,才能達到現在類「得心應手」的地步。
Thumbnail
因最近看到又有人討論起推背圖後,我不禁回想去過去台灣這邊也是拿推背圖來說誰當選。 所以整理一下過去對於推背圖的一些瞭解,重新解剖一下解讀的走向。 首先要先弄清楚推背圖的規律,我整頓完思緒後基本上可以歸納幾點。 1.此預言是描述[中國大陸的最大勢力],所以如今的現在,描述的只會是[中共國],而非[中華
Thumbnail
-> 這篇在說什麼 這篇文章提供一個科目圖的視角來分析科系,每個學生可以依照自己喜歡的工作,來反推出需要學習的科目,進而反推出選這科系的成本效益值 此篇也會leverage這科目圖工具去解除一些大家的誤解/盲點 出路廣的科系就是好科系? 是否有盲點? 出路廣的科系還有分類? 前言 如何判斷?
Thumbnail
本章重點: 介紹一個比布萊克史奈德在《先讓英雄救貓咪》提出的十五步驟架構表更好用的三幕劇本檢視法則:悲劇/喜劇故事曲線圖
Thumbnail
平常有些細節都會被我們省略,想想看: 你穿襪子,是先穿左腳還是右腳? 你刷牙,是先刷左邊還是右邊? 你上完大號,是先拿衛生紙擦屁股,還是先沖馬桶? 撲克牌裡,哪一張人頭是獨眼? 蒙娜麗莎的微笑,是左手壓在右手上,還是右手壓在左手上?... -追蹤、訂閱《郝廣才日日談》來閱讀全文,每天為你說一個故事。
Thumbnail
有些重要的資訊看數字看不出來,那要看什麼?看圖。 亞伯拉罕.沃爾德(Abraham Wald)是一個在美國哥倫比亞大學任教的統計學教授,他在1943年二次大戰中,因為一張圖,救了無數飛行員的生命... -追蹤、訂閱《郝廣才日日談》來閱讀全文,每天為你說一個故事。
哈耶克這種人之所以能在漢語圈傳播得很遠,有一點就是因為他的行為模式很像是胡適那種士大夫,這種人就非常精確地體現了胡適所謂的那種「對政治不感興趣的興趣」。所謂「不感興趣的興趣」,從最難聽的方向進行惡意解釋,恰好就是鮑德溫用來罵羅瑟米爾爵士的那句話:他們追求不負責任的權力,正如歷代的婊子追求牌坊。
Thumbnail
 最近接觸一位熱愛八九十年代流行歌曲的小學生,他在言談間也不時哼起一兩句,使我不期然想起小時候的自己。  香江小故事 「I, I, I was born in Beijing,不知命運是誰定。」黎天
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
Thumbnail
  回想起剛從機械系畢業時,我懂得怎麼計算,也熟悉各種機械理論。但真正要自己設計時,卻只能朦朧應用,可以說是亂兜各種機件,最後拼出了一個四不像的奇怪機構。   而十年後的現在,對機構學的熱情讓我始終從事「能應用『動力機構』」的工作。看過許多機械構造也自己鑽研許多,才能達到現在類「得心應手」的地步。
Thumbnail
因最近看到又有人討論起推背圖後,我不禁回想去過去台灣這邊也是拿推背圖來說誰當選。 所以整理一下過去對於推背圖的一些瞭解,重新解剖一下解讀的走向。 首先要先弄清楚推背圖的規律,我整頓完思緒後基本上可以歸納幾點。 1.此預言是描述[中國大陸的最大勢力],所以如今的現在,描述的只會是[中共國],而非[中華
Thumbnail
-> 這篇在說什麼 這篇文章提供一個科目圖的視角來分析科系,每個學生可以依照自己喜歡的工作,來反推出需要學習的科目,進而反推出選這科系的成本效益值 此篇也會leverage這科目圖工具去解除一些大家的誤解/盲點 出路廣的科系就是好科系? 是否有盲點? 出路廣的科系還有分類? 前言 如何判斷?
Thumbnail
本章重點: 介紹一個比布萊克史奈德在《先讓英雄救貓咪》提出的十五步驟架構表更好用的三幕劇本檢視法則:悲劇/喜劇故事曲線圖
Thumbnail
平常有些細節都會被我們省略,想想看: 你穿襪子,是先穿左腳還是右腳? 你刷牙,是先刷左邊還是右邊? 你上完大號,是先拿衛生紙擦屁股,還是先沖馬桶? 撲克牌裡,哪一張人頭是獨眼? 蒙娜麗莎的微笑,是左手壓在右手上,還是右手壓在左手上?... -追蹤、訂閱《郝廣才日日談》來閱讀全文,每天為你說一個故事。
Thumbnail
有些重要的資訊看數字看不出來,那要看什麼?看圖。 亞伯拉罕.沃爾德(Abraham Wald)是一個在美國哥倫比亞大學任教的統計學教授,他在1943年二次大戰中,因為一張圖,救了無數飛行員的生命... -追蹤、訂閱《郝廣才日日談》來閱讀全文,每天為你說一個故事。
哈耶克這種人之所以能在漢語圈傳播得很遠,有一點就是因為他的行為模式很像是胡適那種士大夫,這種人就非常精確地體現了胡適所謂的那種「對政治不感興趣的興趣」。所謂「不感興趣的興趣」,從最難聽的方向進行惡意解釋,恰好就是鮑德溫用來罵羅瑟米爾爵士的那句話:他們追求不負責任的權力,正如歷代的婊子追求牌坊。
Thumbnail
 最近接觸一位熱愛八九十年代流行歌曲的小學生,他在言談間也不時哼起一兩句,使我不期然想起小時候的自己。  香江小故事 「I, I, I was born in Beijing,不知命運是誰定。」黎天