🎄圖論應用: 二元樹的後序拜訪 Binary Tree Postorder Traversal_LC #145

更新於 2024/08/25閱讀時間約 1 分鐘

題目敘述 145. Binary Tree Postorder Traversal


題目給定一個二元樹的根結點。

請輸出後序拜訪(Post-order traversal)的拜訪序列。


後序拜訪的定義:

1.拜訪左子樹。
2.拜訪右子樹。
3.拜訪目前的節點。


示意圖

raw-image

測試範例

Example 1:


raw-image
Input: root = [1,null,2,3]
Output: [3,2,1]

Example 2:

Input: root = []
Output: []

Example 3:

Input: root = [1]
Output: [1]

約束條件

Constraints:

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

節點總數目介於0~100之間。

請注意,題目有可能給一個空樹

  • -100 <= Node.val <= 100

節點值都介於-100 ~ 100之間。


進階提問

Follow up: Recursive solution is trivial, could you do it iteratively?

遞迴的方式很簡單,請問你能使用迭代的方式完成後序拜訪嗎?


演算法 遞迴法 依據定義實現


其實不管是哪一層,哪一個節點,後序拜訪的規則都是相同的,

只要根據後序拜訪的定義,寫出遞迴function即可。

後序拜訪的定義:

1.拜訪左子樹。
2.拜訪右子樹。
3.拜訪目前的節點。

程式碼 遞迴法 依據定義實現

class Solution:
def postorderTraversal(self, root: TreeNode) -> List[int]:

traversal_path = []
if not root:
# empty node or empty tree
return []

else:
# DFS with postorder
# left child, right child, current node

traversal_path.extend( self.postorderTraversal( root.left ) )
traversal_path.extend( self.postorderTraversal( root.right ) )

traversal_path.append( root.val )

return traversal_path

複雜度分析

時間複雜度: O(n)

每個節點拜訪一次,總共n個節點。

空間複雜度: O(n)

每個節點拜訪一次,總共n個節點。

當整棵樹向左歪斜或者向右歪斜時,具有最大樹高O(n),也是最深的遞迴深度。


程式碼 遞迴法 + python generator


對python generator概念yieldunpacking *語法熟悉的讀者,

也可使用generator生成器的概念,直接在遞迴時動態輸出拜訪結果。

class Solution:
def postorderTraversal(self, root: Optional[TreeNode]) -> List[int]:

def postorder( node ):

## Base case on empty node or empty tree
if not node:
return

## General cases
yield from postorder(node.left)
yield from postorder(node.right)
yield node.val

# --------------------------------------

return [*postorder(root)]

複雜度分析

時間複雜度: O(n)

每個節點拜訪一次,總共n個節點。

空間複雜度: O(n)

每個節點拜訪一次,總共n個節點。

當整棵樹向左歪斜或者向右歪斜時,具有最大樹高O(n),也是最深的遞迴深度。


程式碼 迭代法 搭配stack

class Solution:
def postorderTraversal(self, root: TreeNode) -> List[int]:

traversal_path = []
stack_postorder = [ (root, "init") ]

while stack_postorder:

current, label = stack_postorder.pop()

if not current:
# empty node
continue

elif label != "c":

# DFS with postorder
# left child, right child, current node

# Stack is of Last In First Out,
# thus push in reverse of postorder

stack_postorder.append( (current, "c") )
stack_postorder.append( (current.right, "r") )
stack_postorder.append( (current.left, "l") )

elif label == "c":

traversal_path.append( current.val )

return traversal_path

複雜度分析

時間複雜度: O(n)

每個節點拜訪一次,總共n個節點。

空間複雜度: O(n)

每個節點拜訪一次,總共n個節點。

當整棵樹向左歪斜或者向右歪斜時,具有最大樹高O(n),也是最長的stack長度。


結語

其實常見的tree traversal(前序、中序、後序拜訪),

背後的核心觀念都是相同的。

Tree traversal其實就是探索整顆樹的搜索空間,也可以說是探索整顆樹

只是指定順序略有不同而已。


有興趣的讀者可參考這篇文章,會用更宏觀的觀點看待樹的拜訪。

二元樹的拜訪 結合 DFS深度優先模板


Reference

[1] Binary Tree Postorder Traversal - LeetCode

avatar-img
90會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
題目敘述 Combination Sum II_Leetcode #40 給定一個整數陣列candidates 和 目標值target。 每個陣列元素只能選擇一次,請問有多少種組合方法,可以使得組合數總和 = target? 請把滿足組合數總和 = target的組合方法以陣列的形式返回答案
題目敘述 Integer to English Words 給定一個整數num 請轉換成對應的的英文數字表達(One, Two, Three, ... 那種數字表達式)
題目敘述 Merge Nodes in Between Zeros 給定一個鏈結串列,合併非零區間的節點(以加總的方式合併),輸出合併後的鏈結串列。
題目敘述 All Ancestors of a Node in a Directed Acyclic Graph 給定一個有向無環圖,請找出每個點的祖先,以陣列的形式返回答案。
知道如何從一組給定的英文字母和單字庫中的單字拼出最高分的單字組合。使用DFS + 回溯法 + 剪枝優化的演算法,詳細分析瞭如何展開所有可能的路徑,並且找出符合條件的狀態,協助讀者理解演算法背後的思維和方法。
這篇文章,會帶大家快速回顧DFS+回溯法框架(還沒看過或想複習的可以點連結進去)。 用DFS+回溯法框架,解開 直線排列Permutations 的全系列題目。 幫助讀者鞏固DFS+回溯法框架這個重要的知識點。 回顧 DFS+回溯法框架 白話的意思 # 列舉所有可能的情況,遞迴展開所有分
題目敘述 Combination Sum II_Leetcode #40 給定一個整數陣列candidates 和 目標值target。 每個陣列元素只能選擇一次,請問有多少種組合方法,可以使得組合數總和 = target? 請把滿足組合數總和 = target的組合方法以陣列的形式返回答案
題目敘述 Integer to English Words 給定一個整數num 請轉換成對應的的英文數字表達(One, Two, Three, ... 那種數字表達式)
題目敘述 Merge Nodes in Between Zeros 給定一個鏈結串列,合併非零區間的節點(以加總的方式合併),輸出合併後的鏈結串列。
題目敘述 All Ancestors of a Node in a Directed Acyclic Graph 給定一個有向無環圖,請找出每個點的祖先,以陣列的形式返回答案。
知道如何從一組給定的英文字母和單字庫中的單字拼出最高分的單字組合。使用DFS + 回溯法 + 剪枝優化的演算法,詳細分析瞭如何展開所有可能的路徑,並且找出符合條件的狀態,協助讀者理解演算法背後的思維和方法。
這篇文章,會帶大家快速回顧DFS+回溯法框架(還沒看過或想複習的可以點連結進去)。 用DFS+回溯法框架,解開 直線排列Permutations 的全系列題目。 幫助讀者鞏固DFS+回溯法框架這個重要的知識點。 回顧 DFS+回溯法框架 白話的意思 # 列舉所有可能的情況,遞迴展開所有分
你可能也想看
Google News 追蹤
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
相信多數人都有這樣的經驗,願意無償的準備一場驚喜;投入時間、投入金錢、投入似乎源源不絕的愛。在準備的過程中不覺得累、甚至還樂在其中,那是種很踏實的感覺,因為我們很確定我們應該、想要這麼做。為什麼為心愛的人準備這一切的「過程」會如此甜美呢?由愛做為行動的動力(機)來源與其他行動本質上有什麼差異
Thumbnail
上篇進一步認識基本的圖形架構與三大 Graph 算法,那首先從 shortest path 開始,我們會陸續去理解這些算法,以及可能的應用,如果還沒有看過上一篇的,可以點以下連結~那我們就開始吧! 【圖論Graph】Part1:初探圖形與圖形演算法之應用
Thumbnail
本篇文章深入介紹了圖形的基本概念、組成和應用。從圖形的基本組成,到圖的類型與種類,再到圖形演算法的三大類型,本文將接續圖形領域的深入學習,並分享了對圖形的初步認識和學習方向的小心得。希望對正在學習圖形的人有所幫助。
Thumbnail
圖形演算法在資料處理上扮演重要角色。本文介紹圖形的歷史、定義、技術用途,以及為什麼我們要關心圖形演算法。文末還提及圖形演算法在機器學習領域的應用。下次將介紹更詳細的圖形演算法內容。
Thumbnail
冷冷的天氣中,能到草地上跑跑跳跳 、曬曬太陽是多麼幸福美好的事! 在一次這樣的集會中, 老師詢問孩子們我們要在即將到來的春節做什麼跟大家一起共度呢? 孩子們覺得可以唱唱跳跳~ 老師便提議一首可愛又有特色的歌曲, 孩子們一起坐在草地上玩草、玩樹枝、聽歌、學唱,好快樂唷!
Thumbnail
  回想起剛從機械系畢業時,我懂得怎麼計算,也熟悉各種機械理論。但真正要自己設計時,卻只能朦朧應用,可以說是亂兜各種機件,最後拼出了一個四不像的奇怪機構。   而十年後的現在,對機構學的熱情讓我始終從事「能應用『動力機構』」的工作。看過許多機械構造也自己鑽研許多,才能達到現在類「得心應手」的地步。
Thumbnail
前文參考: 兩張圖回顧一週大盤與個股結構,再談一般人目前最安穩的獲利模式。 2月17日 然後,大家會發現,前文提到的比較現象,在最近幾日更為明確:
Thumbnail
-> 這篇在說什麼 這篇文章提供一個科目圖的視角來分析科系,每個學生可以依照自己喜歡的工作,來反推出需要學習的科目,進而反推出選這科系的成本效益值 此篇也會leverage這科目圖工具去解除一些大家的誤解/盲點 出路廣的科系就是好科系? 是否有盲點? 出路廣的科系還有分類? 前言 如何判斷?
Thumbnail
圖像傳遞資訊最大的好處是什麼?反應快。 1961年10月13日,東柏林設立小綠人交通號誌,這是由東德的心理學家卡爾.佩格勞(Karl Peglau)所設計。為了降低車禍意外,他創造頭戴帽子的可愛行人號誌... -追蹤、訂閱《郝廣才日日談》來閱讀全文,每天為你說一個故事。
Thumbnail
桑塔格的《論攝影》被攝影人視為聖經,但他並不是一本拍攝技巧指南的工具書,而是詮釋攝影、思考攝影的書籍。我以他的目錄章節為架構,寫下自己的筆記心得;紀錄之餘,希望也可以幫助到對此書感興趣的人。本篇為第一章〈在柏拉圖的洞穴裡〉的部分。
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
相信多數人都有這樣的經驗,願意無償的準備一場驚喜;投入時間、投入金錢、投入似乎源源不絕的愛。在準備的過程中不覺得累、甚至還樂在其中,那是種很踏實的感覺,因為我們很確定我們應該、想要這麼做。為什麼為心愛的人準備這一切的「過程」會如此甜美呢?由愛做為行動的動力(機)來源與其他行動本質上有什麼差異
Thumbnail
上篇進一步認識基本的圖形架構與三大 Graph 算法,那首先從 shortest path 開始,我們會陸續去理解這些算法,以及可能的應用,如果還沒有看過上一篇的,可以點以下連結~那我們就開始吧! 【圖論Graph】Part1:初探圖形與圖形演算法之應用
Thumbnail
本篇文章深入介紹了圖形的基本概念、組成和應用。從圖形的基本組成,到圖的類型與種類,再到圖形演算法的三大類型,本文將接續圖形領域的深入學習,並分享了對圖形的初步認識和學習方向的小心得。希望對正在學習圖形的人有所幫助。
Thumbnail
圖形演算法在資料處理上扮演重要角色。本文介紹圖形的歷史、定義、技術用途,以及為什麼我們要關心圖形演算法。文末還提及圖形演算法在機器學習領域的應用。下次將介紹更詳細的圖形演算法內容。
Thumbnail
冷冷的天氣中,能到草地上跑跑跳跳 、曬曬太陽是多麼幸福美好的事! 在一次這樣的集會中, 老師詢問孩子們我們要在即將到來的春節做什麼跟大家一起共度呢? 孩子們覺得可以唱唱跳跳~ 老師便提議一首可愛又有特色的歌曲, 孩子們一起坐在草地上玩草、玩樹枝、聽歌、學唱,好快樂唷!
Thumbnail
  回想起剛從機械系畢業時,我懂得怎麼計算,也熟悉各種機械理論。但真正要自己設計時,卻只能朦朧應用,可以說是亂兜各種機件,最後拼出了一個四不像的奇怪機構。   而十年後的現在,對機構學的熱情讓我始終從事「能應用『動力機構』」的工作。看過許多機械構造也自己鑽研許多,才能達到現在類「得心應手」的地步。
Thumbnail
前文參考: 兩張圖回顧一週大盤與個股結構,再談一般人目前最安穩的獲利模式。 2月17日 然後,大家會發現,前文提到的比較現象,在最近幾日更為明確:
Thumbnail
-> 這篇在說什麼 這篇文章提供一個科目圖的視角來分析科系,每個學生可以依照自己喜歡的工作,來反推出需要學習的科目,進而反推出選這科系的成本效益值 此篇也會leverage這科目圖工具去解除一些大家的誤解/盲點 出路廣的科系就是好科系? 是否有盲點? 出路廣的科系還有分類? 前言 如何判斷?
Thumbnail
圖像傳遞資訊最大的好處是什麼?反應快。 1961年10月13日,東柏林設立小綠人交通號誌,這是由東德的心理學家卡爾.佩格勞(Karl Peglau)所設計。為了降低車禍意外,他創造頭戴帽子的可愛行人號誌... -追蹤、訂閱《郝廣才日日談》來閱讀全文,每天為你說一個故事。
Thumbnail
桑塔格的《論攝影》被攝影人視為聖經,但他並不是一本拍攝技巧指南的工具書,而是詮釋攝影、思考攝影的書籍。我以他的目錄章節為架構,寫下自己的筆記心得;紀錄之餘,希望也可以幫助到對此書感興趣的人。本篇為第一章〈在柏拉圖的洞穴裡〉的部分。