958. Check Completeness of a Binary Tree
解法
这里主要还是要清楚完全二叉树的定义。从层的视角来看,所有节点都是左对齐的,并且中间不能出现空位,因为我们可以通过层序遍历来解题。
代码
/**
* 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) {
if (!root) return true;
queue<TreeNode *> q;
q.push(root);
bool is_leaf = false;
while(q.size()) {
auto n = q.front();
q.pop();
// 叶子节点
if (!n->left && !n->right) {
is_leaf = true;
continue;
}
// 期望是叶子节点,但该节点仍然有儿子
if (is_leaf && (n->right || n->left)) {
return false;
}
// 右儿子存在,左儿子不存在,有空缺
if (n->right && !n->left) {
return false;
}
// 左儿子存在,右儿子不存在,有空缺,之后出现的所有节点应该是叶子节点
if (n->left && !n->right) {
is_leaf = true;
}
if (n->left) q.push(n->left);
if (n->right) q.push(n->right);
}
return true;
}
};
- 下面这种方式更直观,把左右儿子一股脑塞进队列,如果出现了一个空位,之后必须全是空位
/**
* 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) {
if (!root) return true;
queue<TreeNode *> q;
q.push(root);
bool is_leaf = false;
while(q.size()) {
auto n = q.front();
q.pop();
if (!n) {
while(q.size()) {
auto m = q.front();
q.pop();
if (m) {
return false;
}
}
continue;
}
q.push(n->left);
q.push(n->right);
}
return true;
}
};