先簡單回顧一下,今天預計分析的題目:94. Binary Tree Inorder Traversal
題目敘述:https://leetcode.com/problems/binary-tree-inorder-traversal/
題目敘述:
測資的 Input/Output
二元樹主要有四種遍歷/走訪(traversal) binary tree 的方法,分別為:
這邊針對中序進行簡單的介紹:
中序(inorder) 是一種遍歷/走訪(traversal) binary tree 的方法,對於任意節點,先走左側的 sub-tree,再走當前節點,最後走右側 sub-tree。
以此圖為例, inorder traversal 便會是 2
→ +
→ 3
→ x
→ 7
從 root 開始,先走左側子樹,再走 x
,再走 7
左側子樹的走法也是同樣道理,先走 2
,再走 +
,最後走 3
因此整個順序如下
實作方法
遞迴
ans = []
if node == None:
return None
traverse(node.left)
ans.append(node.val)
traverse(node.right)
class Solution:
def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
ans = []
def traverse(node):
if node == None:
return None
traverse(node.left)
ans.append(node.val)
traverse(node.right)
traverse(root)
return ans
迭代
class Solution:
def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
stack = []
ans = []
# 當 root 與 stack 都為空,代表走訪完整個二元樹
while root or stack:
# 不斷走訪左child,直到樹的最左下角,每次走訪都存入 stack 中
while root:
stack.append(root)
root = root.left
# 將儲存在 stack 的資料拿出來
root = stack.pop()
# ans 儲存 root.val
ans.append(root.val)
# 換走訪 root 的 右 child
root = root.right
return ans