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

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

958Check Completeness of a Binary TreeTreesMediumTrees

給定一棵二元樹的根節點,判斷它是否為完全二元樹。完全二元樹除了最後一層外,每層都完全填滿,且最後一層的節點盡量靠左。

Example:

Input: root = [1,2,3,4,5,6] Output: true

Intuition

TIP

BFS 遍歷時,遇到 null 後不應該再出現非 null 節點。

Approaches

1. BFS + Flag — O(n) / O(n)
  • Idea: 層序遍歷,遇到 null 設旗標,之後若再遇到非 null 節點就不是完全二元樹
  • Time: O(n)
  • Space: O(n)
class Solution {
    fun isCompleteTree(root: TreeNode?): Boolean {
        if (root == null) return true
        val queue: Queue<TreeNode?> = LinkedList()
        queue.offer(root)
        var seenNull = false
        while (queue.isNotEmpty()) {
            val node = queue.poll()
            if (node == null) {
                seenNull = true
            } else {
                if (seenNull) return false
                queue.offer(node.left)
                queue.offer(node.right)
            }
        }
        return true
    }
}
⭐ 2. BFS + Index Check — O(n) / O(n)
  • Idea: 為每個節點編號(根為 1,左子 2i,右子 2i+1),若樹是完全的,最大編號應等於節點總數
  • Time: O(n)
  • Space: O(n)
class Solution {
    fun isCompleteTree(root: TreeNode?): Boolean {
        if (root == null) return true
        val queue: Queue<Pair<TreeNode, Int>> = LinkedList()
        queue.offer(root to 1)
        var count = 0
        var maxIndex = 0
        while (queue.isNotEmpty()) {
            val (node, index) = queue.poll()
            count++
            maxIndex = maxOf(maxIndex, index)
            node.left?.let { queue.offer(it to index * 2) }
            node.right?.let { queue.offer(it to index * 2 + 1) }
        }
        return maxIndex == count
    }
}

🔑 Takeaways