🎄圖論應用: 二元樹的中序拜訪 Binary Tree Inorder Traversal_LC #94

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

題目敘述 94.  Binary Tree Inorder Traversal


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


請輸出中序拜訪(In-order traversal)的拜訪序列。


中序拜訪的定義:

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


示意圖

raw-image

測試範例


Example 1:

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


Example 2:

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


Example 3:

Input: root = []

Output: []


Example 4:

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 inorderTraversal(self, root: TreeNode) -> List[int]:
travarlsal_path = []

if root :

# just follow inorder definition
travarlsal_path.extend( self.inorderTraversal( root.left ) )
travarlsal_path .append( root.val )
travarlsal_path.extend( self.inorderTraversal( root.right) )

return travarlsal_path

複雜度分析

時間複雜度: O(n)

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


空間複雜度: O(n)

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

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


程式碼 遞迴法 + python generator


對python generator概念和yield與unpacking *語法熟悉的讀者,

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

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

def inorder( node ):

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

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

return [*inorder( root )]

複雜度分析

時間複雜度: O(n)

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


空間複雜度: O(n)

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


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


程式碼 迭代法 搭配stack

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

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

while stack_inorder:

current, label = stack_inorder.pop()

if not current:
# empty node
continue

elif label != "c":

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

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

stack_inorder.append( (current.right, "r") )
stack_inorder.append( (current, "c") )
stack_inorder.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 Inorder Traversal - LeetCode

留言
avatar-img
留言分享你的想法!
avatar-img
小松鼠的演算法樂園
96會員
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
2025 vocus 推出最受矚目的活動之一——《開箱你的美好生活》,我們跟著創作者一起「開箱」各種故事、景點、餐廳、超值好物⋯⋯甚至那些讓人會心一笑的生活小廢物;這次活動不僅送出了許多獎勵,也反映了「內容有價」——創作不只是分享、紀錄,也能用各種不同形式變現、帶來實際收入。
Thumbnail
2025 vocus 推出最受矚目的活動之一——《開箱你的美好生活》,我們跟著創作者一起「開箱」各種故事、景點、餐廳、超值好物⋯⋯甚至那些讓人會心一笑的生活小廢物;這次活動不僅送出了許多獎勵,也反映了「內容有價」——創作不只是分享、紀錄,也能用各種不同形式變現、帶來實際收入。
Thumbnail
嗨!歡迎來到 vocus vocus 方格子是台灣最大的內容創作與知識變現平台,並且計畫持續拓展東南亞等等國際市場。我們致力於打造讓創作者能夠自由發表、累積影響力並獲得實質收益的創作生態圈!「創作至上」是我們的核心價值,我們致力於透過平台功能與服務,賦予創作者更多的可能。 vocus 平台匯聚了
Thumbnail
嗨!歡迎來到 vocus vocus 方格子是台灣最大的內容創作與知識變現平台,並且計畫持續拓展東南亞等等國際市場。我們致力於打造讓創作者能夠自由發表、累積影響力並獲得實質收益的創作生態圈!「創作至上」是我們的核心價值,我們致力於透過平台功能與服務,賦予創作者更多的可能。 vocus 平台匯聚了
Thumbnail
給定一個輸入陣列,每一個tuple代表節點之間了從屬關係。 請從從屬關係重建整顆二元樹,並且返回整顆二元樹的根結點。
Thumbnail
給定一個輸入陣列,每一個tuple代表節點之間了從屬關係。 請從從屬關係重建整顆二元樹,並且返回整顆二元樹的根結點。
Thumbnail
題目敘述 Binary Tree Maximum Path Sum 給定一個二元樹,請找出最大的區間路徑和是多少? 註: 區間路徑和 = 某個節點a -> 某個節點b的路徑節點值總和。
Thumbnail
題目敘述 Binary Tree Maximum Path Sum 給定一個二元樹,請找出最大的區間路徑和是多少? 註: 區間路徑和 = 某個節點a -> 某個節點b的路徑節點值總和。
Thumbnail
題目敘述 題目會給定一顆二元樹的根結點, 要求我們在指定的層樹d,插入新的一層,節點值為v。 原本的左、右子樹,就成為新的那一層的左子樹、右子樹。 題目的原文敘述 測試範例 Example 1: Input: root = [4,2,6,3,1,5], val = 1, depth =
Thumbnail
題目敘述 題目會給定一顆二元樹的根結點, 要求我們在指定的層樹d,插入新的一層,節點值為v。 原本的左、右子樹,就成為新的那一層的左子樹、右子樹。 題目的原文敘述 測試範例 Example 1: Input: root = [4,2,6,3,1,5], val = 1, depth =
Thumbnail
這篇文章,會帶著大家複習以前學過的二元搜尋樹(Binary Search Tree)框架, 並且以二分搜尋樹的概念與定義為核心, 貫穿一些相關聯的題目,透過框架複現來幫助讀者理解這個演算法框架。 二元搜尋樹(Binary Search Tree)的定義
Thumbnail
這篇文章,會帶著大家複習以前學過的二元搜尋樹(Binary Search Tree)框架, 並且以二分搜尋樹的概念與定義為核心, 貫穿一些相關聯的題目,透過框架複現來幫助讀者理解這個演算法框架。 二元搜尋樹(Binary Search Tree)的定義
Thumbnail
題目敘述 題目會給定一棵二元樹的根結點,要求我們找出這棵二元樹最後一層最左邊的值。 題目的原文敘述 測試範例 Example 1: Input: root = [2,1,3] Output: 1 Example 2: Input: root = [1,2,3,4,null,5,6
Thumbnail
題目敘述 題目會給定一棵二元樹的根結點,要求我們找出這棵二元樹最後一層最左邊的值。 題目的原文敘述 測試範例 Example 1: Input: root = [2,1,3] Output: 1 Example 2: Input: root = [1,2,3,4,null,5,6
Thumbnail
題目敘述 題目會給我們一棵BST二元搜索樹的根結點root,還有一個指定的目標值key。 要求我們在樹中刪除帶有這個key值的節點,並且返回更新過後二元搜索樹的樹根root。 題目的原文敘述 測試範例 Example 1: Input: root = [5,3,6,2,4,null,
Thumbnail
題目敘述 題目會給我們一棵BST二元搜索樹的根結點root,還有一個指定的目標值key。 要求我們在樹中刪除帶有這個key值的節點,並且返回更新過後二元搜索樹的樹根root。 題目的原文敘述 測試範例 Example 1: Input: root = [5,3,6,2,4,null,
Thumbnail
題目敘述 題目會給定一顆二元樹的根結點Root node,和這棵樹中的任意兩個節點p, q。 請找出p, q 在這棵二元數裡面的最接近公共祖先節點是誰? 最接近的公共節點: 就是p, q兩個節點從下往上走,第一個交會的節點。 題目的原文敘述 測試範例 Example 1: Inpu
Thumbnail
題目敘述 題目會給定一顆二元樹的根結點Root node,和這棵樹中的任意兩個節點p, q。 請找出p, q 在這棵二元數裡面的最接近公共祖先節點是誰? 最接近的公共節點: 就是p, q兩個節點從下往上走,第一個交會的節點。 題目的原文敘述 測試範例 Example 1: Inpu
Thumbnail
題目敘述 題目會給我們一顆二元樹的根結點,請我們列出每一層最右邊的節點值,以陣列的形式返回答案。 題目的原文敘述 測試範例 Example 1: Input: root = [1,2,3,null,5,null,4] Output: [1,3,4] 每一層最右邊的節點值分別是1, 3,
Thumbnail
題目敘述 題目會給我們一顆二元樹的根結點,請我們列出每一層最右邊的節點值,以陣列的形式返回答案。 題目的原文敘述 測試範例 Example 1: Input: root = [1,2,3,null,5,null,4] Output: [1,3,4] 每一層最右邊的節點值分別是1, 3,
Thumbnail
題目敘述 題目會給定我們一顆二元搜索樹BST的根結點, 還有一個指定區間的上邊界R 和 下邊界L。 請問二元搜索樹中,所有落在指定區間內的節點元素值的總和是多少? 題目的原文敘述 測試範例 Example 1: Input: root = [10,5,15,3,7,null,18], l
Thumbnail
題目敘述 題目會給定我們一顆二元搜索樹BST的根結點, 還有一個指定區間的上邊界R 和 下邊界L。 請問二元搜索樹中,所有落在指定區間內的節點元素值的總和是多少? 題目的原文敘述 測試範例 Example 1: Input: root = [10,5,15,3,7,null,18], l
Thumbnail
題目會給定一顆二元樹的根結點,要求我們驗證這一顆樹是否為合法的二元搜索樹, 也就是所謂的Binary search tree, aka BST?
Thumbnail
題目會給定一顆二元樹的根結點,要求我們驗證這一顆樹是否為合法的二元搜索樹, 也就是所謂的Binary search tree, aka BST?
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News