BM35 判断是不是完全二叉树
描述
给定一个二叉树,确定他是否是一个完全二叉树。
完全二叉树的定义:若二叉树的深度为 h,除第 h 层外,其它各层的结点数都达到最大个数,第 h 层所有的叶子结点都连续集中在最左边,这就是完全二叉树。(第 h 层可能包含 [1~2h] 个节点)
数据范围:节点数满足
样例图1:样例图2:样例图3:
示例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);
}
}
}