/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* };
*/
class Solution {
public:
//采用广度优先搜索,并且是从每一层的右边进行检测,遇到有节点且再次遇到空节点说明有空缺即false;
bool isCompleteTree(TreeNode* root) {
queue<TreeNode*> q;
q.push(root);
int storey = 1;
while(!q.empty()){ //层循环
int flag = 0; //0表示右边还没有节点,1表示右边已经有了节点,遇到空节点就检测flag状态
for(int i=1; i<=storey && !q.empty(); i++){ //层内处理,注意队列不能为空,
TreeNode* node = q.front();q.pop();
if(node->right){
q.push(node->right);
flag = 1;
}else if(!node->right && flag == 1){ //空节点但是右边已经有节点了;
return false;
} //空节点但空节点右边都是空节点,合法,不处理;
if(node->left){
q.push(node->left);
flag = 1;
}else if(!node->left && flag ==1){
return false;
}
}
storey = storey*2;
}
return true;
}
};