Easy草稿★★★★★O(n) 時間 · O(h) 空間
TreeDFSBFSRecursion
Patterns🌊 廣度優先 BFS🌳 樹形 DFS
尚未複習過

解法已隱藏 — 先讀題目敘述、自己想想看,再點上方按鈕揭曉。

226Invert Binary TreeTreesEasyTrees

給定一棵二元樹的根節點,將整棵樹左右翻轉(鏡像),回傳翻轉後的根節點。每個節點的左右子樹互換。

Example:

Input: root = [4,2,7,1,3,6,9] Output: [4,7,2,9,6,3,1]

Intuition

TIP

對每個節點,交換其左右子節點,然後遞迴處理子樹。

Approaches

⭐ 1. Recursive DFS — O(n) / O(h)
  • Idea: 後序遍歷,先遞迴翻轉左右子樹,再交換左右子節點
  • Time: O(n),每個節點訪問一次
  • Space: O(h),遞迴堆疊深度,h 為樹高
class Solution {
    fun invertTree(root: TreeNode?): TreeNode? {
        if (root == null) return null
        val left = invertTree(root.left)
        val right = invertTree(root.right)
        root.left = right
        root.right = left
        return root
    }
}
2. Iterative BFS — O(n) / O(n)
  • Idea: 使用佇列進行層序遍歷,對每個節點交換左右子節點
  • Time: O(n)
  • Space: O(n),佇列最多存放一層的節點
class Solution {
    fun invertTree(root: TreeNode?): TreeNode? {
        if (root == null) return null
        val queue: ArrayDeque<TreeNode> = ArrayDeque()
        queue.add(root)
        while (queue.isNotEmpty()) {
            val node = queue.removeFirst()
            val temp = node.left
            node.left = node.right
            node.right = temp
            node.left?.let { queue.add(it) }
            node.right?.let { queue.add(it) }
        }
        return root
    }
}

🔑 Takeaways