题意:
        给定一个二叉树,确定他是否是一个完全二叉树。

方法一:
bfs

思路:
        bfs层次遍历树。
        步骤:
                如果没有左儿子,有右儿子,则不满足完全二叉树;
                如果有左儿子,则入队;
                如果有右儿子,则入队,否则置flag=1;(flag为1表示后序的队列元素不能有儿子节点)
                如果flag==1并且有儿子,则不满足完全二叉树。



class Solution {
public:
    bool isCompleteTree(TreeNode* root) {
        if(root==nullptr)
            return true;
        queue<TreeNode*> q;//队列
        q.push(root);//入队
        int flag=0;
        while(!q.empty()){//队列非空
            TreeNode* t=q.front();
            q.pop();
            if(flag==1&&(t->left||t->right))//如果flag==1并且有儿子,则不满足完全二叉树
                return false;
            if(t->left==nullptr&&t->right)//如果没有左儿子,有右儿子,则不满足完全二叉树
                return false;
            if(t->left){//如果有左儿子,则入队
                q.push(t->left);
            }
            if(t->right){//如果有右儿子,则入队,否则置flag=1
                q.push(t->right);
            }else{
                flag=1;
            }
        
        }
        return true;
    }
};


时间复杂度:
空间复杂度:

方法二:
dfs

思路:
        dfs遍历树,并为每个节点标记一个id。
        根节点 id 初始化为1,左儿子为 id*2, 右儿子为 id*2+1,
        并同时记录数节点的个数 num 。
        如果是完全二叉树,则 节点的个数num 会等于 id 的最大值;
        否则,说明不是完全二叉树。


class Solution {
public:
    unordered_map<int,int> mp;
    bool isCompleteTree(TreeNode* root) {
        if(root==nullptr)
            return true;
        int num=dfs(root,1);//递归
        for(auto x:mp){
            if(x.first>num)//如果id大于节点数量,则说明不是完全二叉树
                return false;
        }
        return true;
    }
    int dfs(TreeNode* root,int id){//递归,返回子树的节点个数
        if(root==nullptr)
            return 0;
        mp[id]=1;//标记id出现过
        return 1+dfs(root->left,id*2)+dfs(root->right,id*2+1);//递归左右儿子
    }
};


时间复杂度:
空间复杂度: