题解 | #判断是不是完全二叉树#
判断是不是完全二叉树
https://www.nowcoder.com/practice/8daa4dff9e36409abba2adbe413d6fae
/**
* 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) {
// write code here
// 广度优先搜索
deque<TreeNode*> d;
d.emplace_back(root);
int h=1;
// 看看是否是最后一层
bool flag = false;
while(!d.empty())
{
int len=d.size();
// cout<<h<<", "<<len<<endl;
// 可能达到最后一层了
if(h!=len)
{
// 前面已经有一层不满足节点达到最大个数了
if(!flag)
flag = true;
else
{
cout<< "1" << endl;
return false;
}
}
bool flag_temp = false;
for(int i=0;i<len;++i)
{
// 有右子树但是没有左子树
if(!d.front()->left && d.front()->right)
{
cout<< "2" << endl;
return false;
}
// 当前行遇到了子树残缺的节点,那么后面的节点理应没有子树
if(!flag_temp)
{
if(!d.front()->left || !d.front()->right)
flag_temp = true;
}
// 改行已经遇到一个左右节点的节点了,但是后面的节点还有左右节点;
else {
if(d.front()->left || d.front()->right)
return false;
}
if(d.front()->left)
d.emplace_back(d.front()->left);
if(d.front()->right)
d.emplace_back(d.front()->right);
d.pop_front();
}
h *= 2;
}
return true;
}
};
虚数五行区解题中心 文章被收录于专栏
非淡泊无以明志,非宁静无以致远

