1. 程式人生 > 實用技巧 >LeetCode 94.二叉樹的中序遍歷

LeetCode 94.二叉樹的中序遍歷

給定一個二叉樹,返回它的中序 遍歷。
示例:
輸入: [1,null,2,3]
   1
    \
     2
    /
   3

輸出: [1,3,2]
進階: 遞迴演算法很簡單,你可以通過迭代演算法完成嗎?
## 迭代
class Solution:
    def inorderTraversal(self, root: TreeNode) -> List[int]:
        """
        使用棧記錄節點,後進先出。
        使用顏色標記節點的狀態,新節點為白色,已訪問的節點為灰色。
        如果遇到的節點為白色,則將其標記為灰色,然後將其右子節點、自身、左子節點依次入棧。
        如果遇到的節點為灰色,則將節點的值輸出。
        """
        WHITE, GRAY = 0, 1
        res = []
        stack = [(WHITE, root)]
        while stack:
            color, node = stack.pop()
            if node is None: continue
            if color == WHITE:
                stack.append((WHITE, node.right))
                stack.append((GRAY, node))
                stack.append((WHITE, node.left))
            else:
                res.append(node.val)
        return res

## 遞迴
class Solution:
    def inorderTraversal(self, root: TreeNode) -> List[int]:
        res = []
        self.helper(root, res)
        return res

    def helper(self, root, res):
        if root:
            self.helper(root.left, res)
            res.append(root.val)
            self.helper(root.right, res)