[Leetcode解題] 958. Check Completeness of a Binary Treer
25 July 2025
medium
bfs
題目
958. Check Completeness of a Binary Tree
給定一個二元樹的根節點 root
,判斷這棵樹是否為完全二元樹 (Complete Binary Tree)。
Complete Binary Tree 完全二元樹的定義
- 除了最後一層之外,其他層都必須被完全填滿。
- 最後一層的節點必須從左到右依序填滿,不能出現右邊有節點但左邊空缺的情況。
換句話說,完全二元樹的節點在「層序遍歷 (BFS)」中,一旦出現 null
,後面不應再出現非空節點,否則不是完全二元樹。
解題思路
- 完全二元樹在層序遍歷時,不能在
null
之後出現非null
節點。 -
因此,我們可以用 BFS(層序遍歷)來檢查:
- 使用佇列
queue
依序遍歷所有節點。 - 當遇到
null
時,標記seenNull = true
。 - 如果
seenNull == true
後還遇到非null
節點,代表後面還有節點,違反完全二元樹定義,回傳false
。 - 若 BFS 結束後都沒違反條件,則是完全二元樹。
- 使用佇列
C++ 實作
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
bool isCompleteTree(TreeNode* root) {
queue<TreeNode*> q;
q.push(root);
bool seenNull = false;
while (!q.empty()) {
TreeNode* node = q.front(); q.pop();
if (!node) {
seenNull = true; // 遇到空節點後,後面不該有非空節點
} else {
if (seenNull) return false; // 遇到空後又遇到非空 => 非完全二元樹
q.push(node->left);
q.push(node->right);
}
}
return true;
}
};
Python 實作
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def isCompleteTree(self, root: Optional[TreeNode]) -> bool:
q = deque([root])
seen_null = False
while q:
node = q.popleft()
if not node:
seen_null = True
else:
if seen_null:
return False
q.append(node.left)
q.append(node.right)
return True
時間與空間複雜度
- 時間複雜度:$O(N)$
- 每個節點只會被訪問一次,N 為節點數。
- 空間複雜度:$O(N)$
- 最壞情況下會儲存整層的節點(接近 $N/2$)。