题解 | #判断是不是完全二叉树#
判断是不是完全二叉树
https://www.nowcoder.com/practice/8daa4dff9e36409abba2adbe413d6fae
/**
该题目的总体思路是:按层排序;
在按层排序的基础上,要对每一层的节点数进行判断以符合完全二叉树的要求;
同时,要处理最后一层的情况
关键点:就是对左右子节点为nullptr时,也需要给出nullptr的数据,
以此作为辅助数据,可以有效的利用完全二叉树的规则,进行逻辑上的正确性判断;
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* };
*/
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param root TreeNode类
* @return bool布尔型
*/
bool isCompleteTree(TreeNode* root) {
if (root == nullptr)
return true;
queue<TreeNode*> s;
s.push(root);
auto cur_line_node_count = 1;
auto cur_line_should_count = 1;
while (!s.empty()) {
auto ct = s.size();
cur_line_node_count = 0;
for (auto i = 0; i < ct; ++i) {
auto cur = s.front();
s.pop();
if (cur->left != nullptr) {
++cur_line_node_count;
s.push(cur->left);
} else {
s.push(nullptr);
}
if (cur->right != nullptr) {
++cur_line_node_count;
s.push(cur->right);
} else {
s.push(nullptr);
}
}
cur_line_should_count *= 2;
if (cur_line_node_count != cur_line_should_count)
break;
}
if (!s.empty()) {
auto ct = s.size();
for (auto i = 0; i < ct; ++i) {
auto cur = s.front();
s.pop();
if (cur != nullptr && cur->left == nullptr && cur->right == nullptr)
continue;
if (cur != nullptr)
return false;
else
break;
}
for (auto i = 0; i < s.size(); ++i) {
auto cur = s.front();
s.pop();
if (cur != nullptr)
return false;
}
return true;
}
return true;
}
};