🎄圖論應用: 樹的後序拜訪 N-ary Tree Postorder Traversal_Leetcode #590

更新於 發佈於 閱讀時間約 1 分鐘

題目敘述 N-ary Tree Postorder Traversal


題目給定一個N-ary(每個節點最多N個子樹)的樹根。

請返回後序拜訪這棵樹的軌跡。


推廣後的後序拜訪的定義:

1.從左到右依序拜訪所有子樹
2.拜訪目前的節點


示意圖

raw-image



測試範例

Example 1:

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


Example 2:

raw-image
Input: root = [1,null,2,3,4,5,null,null,6,7,null,8,null,9,10,null,null,11,null,12,null,13,null,null,14]
Output: [2,6,14,11,7,3,12,8,4,13,9,10,5,1]



約束條件

Constraints:

  • The number of nodes in the tree is in the range [0, 10^4].

節點總數目介於0~一萬。

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

  • 0 <= Node.val <= 10^4

節點值都介於0 ~ 一萬之間。

  • The height of the n-ary tree is less than or equal to 1000.

樹高 <= 1000


進階提問

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

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


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


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

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


推廣後的後序拜訪的定義:

1.從左到右依序拜訪所有子樹。
2.拜訪目前的節點。

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

class Solution:
def postorder(self, root: 'Node') -> List[int]:

if not root:
# base case:
# empty node or empty tree
return []

else:
# general case:

path = []

# Traverse children with postorder:
for child in root.children:
path += self.postorder( child )

# Travese current node with postorder:
path.append( root.val )

return path

複雜度分析

時間複雜度: O(n)

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


空間複雜度: O(n)

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

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


程式碼 迭代法 搭配stack

class Solution:
def postorder(self, root: 'Node') -> List[int]:

# base case:
traversal_stack = [ (root, 'init') ]

path = []

# general case:
while traversal_stack:

current, label = traversal_stack.pop()

if current:

if label != 'cur':


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

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

traversal_stack.append( (current, 'cur') )

for i in range( len(current.children)-1, -1, -1):
traversal_stack.append( (current.children[i],'child' ) )

else:

path.append( current.val)

return path



複雜度分析

時間複雜度: O(n)

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


空間複雜度: O(n)

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

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


結語

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

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


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

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


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

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


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


Reference

[1] N-ary Tree Postorder Traversal - LeetCode

留言
avatar-img
留言分享你的想法!
上次那則留言進不去了🙄最近要進留言都好困難啊!😆
小松鼠-avatar-img
發文者
2024/08/26
林燃(創作小說家) 總之就是謝謝仙女姊姊來這邊玩,小松鼠的院子蓬蓽生輝~
小松鼠-avatar-img
發文者
2024/09/11
從Python來學圖論Graph與DFS深度優先探索提及了這篇文章,趕快過去看看吧!
avatar-img
小松鼠的演算法樂園
95會員
427內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
2024/09/26
Leetcode 729. My Calendar I 給定一個行事曆的class定義和行程安排的介面interface。 請完成下列function 1.建構子MyCalendar() 初始化MyCalendar物件 2.boolean book(int start, int end) 插入新行程
Thumbnail
2024/09/26
Leetcode 729. My Calendar I 給定一個行事曆的class定義和行程安排的介面interface。 請完成下列function 1.建構子MyCalendar() 初始化MyCalendar物件 2.boolean book(int start, int end) 插入新行程
Thumbnail
2024/09/10
Insert Greatest Common Divisors in Linked List 題目給定一個鏈結串列, 請在兩兩節點之間加入一個新節點,新節點的值為兩者之間的最大公因數。 最後返回新串列的head node作為答案。
Thumbnail
2024/09/10
Insert Greatest Common Divisors in Linked List 題目給定一個鏈結串列, 請在兩兩節點之間加入一個新節點,新節點的值為兩者之間的最大公因數。 最後返回新串列的head node作為答案。
Thumbnail
2024/09/09
2326. Spiral Matrix IV 題目給定一個Linked list和對應的矩陣高度m、寬度n。 請依照順時針的拜訪順序, 從左上角出發,依照次序把Linked List的內容填到矩陣裡。 如果有剩餘不足的空位,就填補-1。 最後將填補好的矩陣返回作為答案。
Thumbnail
2024/09/09
2326. Spiral Matrix IV 題目給定一個Linked list和對應的矩陣高度m、寬度n。 請依照順時針的拜訪順序, 從左上角出發,依照次序把Linked List的內容填到矩陣裡。 如果有剩餘不足的空位,就填補-1。 最後將填補好的矩陣返回作為答案。
Thumbnail
看更多
你可能也想看
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
題目敘述 題目會給定一顆二元樹的根結點Root node,和指定的目標值targetSum。 問我們能不能從二元樹裡面找到一條從根結點到葉子結點的路徑,其路徑上的節點值總和恰好為targetSum? 可以的話,返回True。 無解的話,返回False。 題目的原文敘述 測試範例 E
Thumbnail
題目敘述 題目會給定一顆二元樹的根結點Root node,和指定的目標值targetSum。 問我們能不能從二元樹裡面找到一條從根結點到葉子結點的路徑,其路徑上的節點值總和恰好為targetSum? 可以的話,返回True。 無解的話,返回False。 題目的原文敘述 測試範例 E
Thumbnail
題目會給我們一顆二元樹的根結點,要求我們找出每一層最大的節點值。
Thumbnail
題目會給我們一顆二元樹的根結點,要求我們找出每一層最大的節點值。
Thumbnail
題目會給我們節點總數目n、左子樹的關係陣列、右子樹的關係陣列,要求我們驗證在給定的條件下,能不能構成一顆合法的二元樹。
Thumbnail
題目會給我們節點總數目n、左子樹的關係陣列、右子樹的關係陣列,要求我們驗證在給定的條件下,能不能構成一顆合法的二元樹。
Thumbnail
題目會給定給我們一顆二元樹的根結點, 要求我們輸出上下顛倒的Level-order traversal的拜訪結果。
Thumbnail
題目會給定給我們一顆二元樹的根結點, 要求我們輸出上下顛倒的Level-order traversal的拜訪結果。
Thumbnail
題目會給我們一顆二元樹的根節點, 要求我們對齊根節點正中央的虛擬分割線,反轉整顆二元樹。
Thumbnail
題目會給我們一顆二元樹的根節點, 要求我們對齊根節點正中央的虛擬分割線,反轉整顆二元樹。
Thumbnail
題目會給定給我們一顆二元樹的根結點,要求我們輸出Level-order traversal的拜訪結果。 在這題,我們會複習並利用BFS模板,來實現逐層搜索演算法。
Thumbnail
題目會給定給我們一顆二元樹的根結點,要求我們輸出Level-order traversal的拜訪結果。 在這題,我們會複習並利用BFS模板,來實現逐層搜索演算法。
Thumbnail
其實常見的tree traversal (前序、中序、後序拜訪), 背後的核心觀念都是相同的。 Tree traversal其實就是探索整顆樹的搜索空間,也可以說是探索整顆樹, 只是指定順序略有不同而已。 本文將結合經典的DFS模板,做一個全面性的回顧。
Thumbnail
其實常見的tree traversal (前序、中序、後序拜訪), 背後的核心觀念都是相同的。 Tree traversal其實就是探索整顆樹的搜索空間,也可以說是探索整顆樹, 只是指定順序略有不同而已。 本文將結合經典的DFS模板,做一個全面性的回顧。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News