/**
 * 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;
    }
};