先簡單回顧一下,今天預計分析的題目: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