#include <iostream>
#include <queue>
using namespace std;
// 定义二叉树节点结构体
struct TreeNode
{
char val; // 节点值
TreeNode *left; // 左子节点指针
TreeNode *right; // 右子节点指针
TreeNode() : val(0), left(nullptr), right(nullptr) {}
TreeNode(char x) : val(x), left(nullptr), right(nullptr) {}
TreeNode(char x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};
// 判断二叉树是否为完全二叉树
bool isCompleteTree(TreeNode *root)
{
queue<TreeNode*> q; // 定义一个队列用于层次遍历
q.push(root); // 将根节点入队
bool leaf = false; // 标记是否遇到叶子节点
while (q.size()) // 当队列不为空时,继续遍历
{
TreeNode *t = q.front(); // 获取队首元素
q.pop(); // 弹出队首元素
if (!t) // 如果当前节点为空
{
leaf = true; // 标记已遇到叶子节点(或空节点)
continue; // 继续检查下一个节点
}
if (leaf && t) return false; // 如果已经遇到空节点,但后续还有非空节点,则树不是完全二叉树
// 将当前节点的左子节点和右子节点入队
q.push(t->left);
q.push(t->right);
}
return true; // 如果遍历完毕没有发现违反完全二叉树性质的节点,返回 true
}
int main()
{
// 构建第一个二叉树:
// A
// / \
// B C
// / \
// D E
TreeNode *root1 = new TreeNode('A',
new TreeNode('B',
new TreeNode('D'),
new TreeNode('E')
),
new TreeNode('C'));
// 输出第一个二叉树的判断结果
cout << "Tree 1 is complete: " << isCompleteTree(root1) << endl; // 应输出 1,表示为完全二叉树
// 构建第二个二叉树:
// A
// / \
// B C
// / /
// D E
TreeNode *root2 = new TreeNode('A',
new TreeNode('B',
new TreeNode('D'),
nullptr
),
new TreeNode('C',
new TreeNode('E'),
nullptr));
// 输出第二个二叉树的判断结果
cout << "Tree 2 is complete: " << isCompleteTree(root2) << endl; // 应输出 0,表示不为完全二叉树
return 0;
}
12-12
9532
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
08-21
1091
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)