#include <stdio.h>
#include <stdlib.h>
// 定义二叉树节点结构
struct TreeNode {
int data;
struct TreeNode* left;
struct TreeNode* right;
};
// 定义队列节点结构
struct QueueNode {
struct TreeNode* treeNode;
struct QueueNode* next;
};
// 定义队列结构
struct Queue {
struct QueueNode* front;
struct QueueNode* rear;
};
// 初始化队列
void initQueue(struct Queue* q) {
q->front = q->rear = NULL;
}
// 入队操作
void enqueue(struct Queue* q, struct TreeNode* treeNode) {
struct QueueNode* newNode = (struct QueueNode*)malloc(sizeof(struct QueueNode));
newNode->treeNode = treeNode;
newNode->next = NULL;
if (q->rear == NULL) {
q->front = q->rear = newNode;
} else {
q->rear->next = newNode;
q->rear = newNode;
}
}
// 出队操作
struct TreeNode* dequeue(struct Queue* q) {
if (q->front == NULL) {
return NULL;
}
struct QueueNode* temp = q->front;
struct TreeNode* treeNode = temp->treeNode;
q->front = q->front->next;
if (q->front == NULL) {
q->rear = NULL;
}
free(temp);
return treeNode;
}
// 判断是否为完全二叉树
int isCompleteBinaryTree(struct TreeNode* root) {
if (root == NULL) {
return 1; // 空树也是完全二叉树
}
struct Queue queue;
initQueue(&queue);
int flag = 0; // 标志位,表示是否遇到空节点
enqueue(&queue, root);
while (queue.front != NULL) {
struct TreeNode* currentNode = dequeue(&queue);
// 如果当前节点是空节点,设置标志位
if (currentNode == NULL) {
flag = 1;
} else {
// 如果遇到空节点后又遇到非空节点,说明不是完全二叉树
if (flag) {
return 0;
}
enqueue(&queue, currentNode->left);
enqueue(&queue, currentNode->right);
}
}
return 1; // 遍历完成,是完全二叉树
}
// 测试
int main() {
// 构建一个二叉树作为示例
struct TreeNode* root = (struct TreeNode*)malloc(sizeof(struct TreeNode));
root->data = 1;
root->left = (struct TreeNode*)malloc(sizeof(struct TreeNode));
root->left->data = 2;
root->left->left = root->left->right = NULL;
root->right = (struct TreeNode*)malloc(sizeof(struct TreeNode));
root->right->data = 3;
root->right->left = root->right->right = NULL;
// 判断是否为完全二叉树
if (isCompleteBinaryTree(root)) {
printf("是完全二叉树\n");
} else {
printf("不是完全二叉树\n");
}
// 释放内存
free(root->left);
free(root->right);
free(root);
return 0;
}