​BM35 判断是不是完全二叉树​

描述

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

完全二叉树的定义:若二叉树的深度为 h,除第 h 层外,其它各层的结点数都达到最大个数,第 h 层所有的叶子结点都连续集中在最左边,这就是完全二叉树。(第 h 层可能包含 [1~2h] 个节点)


数据范围:节点数满足 [二叉树]BM35 判断是不是完全二叉树-中等_完全二叉树

样例图1:[二叉树]BM35 判断是不是完全二叉树-中等_完全二叉树_02样例图2:[二叉树]BM35 判断是不是完全二叉树-中等_完全二叉树_03样例图3:[二叉树]BM35 判断是不是完全二叉树-中等_完全二叉树_04

示例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

题解

如果是完全二叉树,当第一个空结点出现后,之后的所有节点都只能为空节点;要么没有出现过空结点,使用队列层次遍历时先左后右进行遍历

#include <bits/stdc++.h>

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