BM35 判断是不是完全二叉树
描述
给定一个二叉树,确定他是否是一个完全二叉树。
完全二叉树的定义:若二叉树的深度为 h,除第 h 层外,其它各层的结点数都达到最大个数,第 h 层所有的叶子结点都连续集中在最左边,这就是完全二叉树。(第 h 层可能包含 [1~2h] 个节点)
数据范围:节点数满足 
样例图1:
样例图2:
样例图3:![[二叉树]BM35 判断是不是完全二叉树-中等_完全二叉树_04](https://file.cfanz.cn/uploads/png/2022/06/15/15/353d1fUX7f.png)
示例1
输入:
{1,2,3,4,5,6}复制返回值:
true复制
示例2
输入:
{1,2,3,4,5,6,7}复制返回值:
true复制
示例3
输入:
{1,2,3,4,5,#,6}复制返回值:
false题解
如果是完全二叉树,当第一个空结点出现后,之后的所有节点都只能为空节点;要么没有出现过空结点,使用队列层次遍历时先左后右进行遍历
// https://www.nowcoder.com/practice/8daa4dff9e36409abba2adbe413d6fae?tpId=295&tags=&title=&difficulty=0&judgeStatus=0&rp=0&sourceUrl=%2Fexam%2Foj
struct TreeNode
{
  int val;
  struct TreeNode *left;
  struct TreeNode *right;
  TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};
bool isCompleteTree(TreeNode *root)
{
  if (root == nullptr)
  {
    return true;
  }
  if (root->left == nullptr && root->right == nullptr)
  {
    return true;
  }
  std::queue<TreeNode *> q;
  q.push(root);
  bool flag = false;
  while (!q.empty())
  {
    auto node = q.front();
    q.pop();
    if (node == nullptr)
    {
      flag = true;
    }
    else
    {
      if (flag)
      {
        return false;
      }
      q.push(node->left);
      q.push(node->right);
    }
  }
}









