題目連結:94. Binary Tree Inorder Traversal
題目主題:Stack, Tree, Depth-First Search, Binary Tree
前一篇Preorder Traversal分享完後,這次是Inorder Traversal觀念題。若沒看過前一篇,還是建議先往前看過Tree的觀念及Preorder Traversal會更好。
在DFS(Depth-First Search)中Traversal分成三種方式:
今天會用到的就是Inorder Traversal。
前一篇提到的Preorder原則是一進入節點就讀這個值,而Inorder不一樣的是第一次返回到節點才讀這個值。假設資料是 tree = [5, 2, 6, 1, 3, null, 8]
上圖中,每個節點上面的數字是讀的順序,而紅色虛線箭頭就是讀的方向。Inorder排出來就會是 [1, 2, 3, 5, 6, 8],Inorder讀完的感覺是整棵樹越左邊的節點就會越先讀到,換一種方式看如下圖。
建議可以看看LeetCode原本的題目說明,這邊是用我的方式說明題目,參考就好。
今天的題目,目標就是用Inorder的方式來讀取樹,依照這個Inorder的順序將節點的值排到一個列表中,最後回傳這個列表。
約束:
範例1
輸入: root = [1,null,2,3]
輸出: [1,3,2]
範例2
輸入: root = []
輸出: []
範例3
輸入: root = [1]
輸出: [1]
範例4
輸入: root = [1,2]
輸出: [2,1]
範例5
輸入: root = [1,null,2]
輸出: [1,2]
建議到這邊先停下來,嘗試自己解解看,若沒有想法可再繼續走下去。
範例:tree = [5, 2, 6, null, 8]
下圖中是實際上Traversal在走的過程,實際在想像移動過程的時候,建議在最下面的節點都補虛線的節點代表走到底了。
若因為沒想法而走到這邊,建議看完想像以後再給自己一次機會試一次。
class Solution:
# root 要進入的節點
# inorder_list 最終要回傳的list
def traversal(self, root: TreeNode, inorder_list: List[int]):
# 沒有節點往回走
if root == None: return inorder_list
# 前往左邊子節點
inorder_list = self.traversal(root.left, inorder_list)
# 左邊子節點回來以後,將目前節點的值紀錄到list中
inorder_list.append(root.val)
# 前往右邊子節點
inorder_list = self.traversal(root.right, inorder_list)
return inorder_list
def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
return self.traversal(root, [])
若內容有什麼問題或建議歡迎一起交流:)
感謝您今天願意花時間看完這篇文章~~~~
Next:145. Binary Tree Postorder Traversal