用C语言写一段代码判别给定二叉树是否为完全二叉树,要求按层序遍历方式,先把所有结点都入队列。通过队列进行判断。并写主函数实现
时间: 2024-11-03 07:22:28 浏览: 29
完全二叉树的层序遍历.docx 完全二叉树的层序遍历是通过逐层访问树节点的一种遍历方式 层序遍历通常使用队列数据结构来实现
在C语言中,我们可以使用队列数据结构以及层次遍历来判断一个二叉树是否为完全二叉树。首先,我们需要创建一个结构体表示二叉树节点,然后实现队列功能,最后编写主函数来进行判断。以下是代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义二叉树节点结构
typedef struct TreeNode {
int val;
struct TreeNode* left;
struct TreeNode* right;
} TreeNode;
// 创建一个空队列用于存储节点
typedef struct Queue {
TreeNode** nodes;
int front, rear;
int capacity;
} Queue;
// 初始化队列
Queue* initQueue(int capacity) {
Queue* q = (Queue*)malloc(sizeof(Queue));
q->nodes = (TreeNode**)malloc(capacity * sizeof(TreeNode*));
q->front = q->rear = -1;
q->capacity = capacity;
return q;
}
// 入队操作
void enqueue(Queue* q, TreeNode* node) {
if (q->rear == q->capacity - 1) {
printf("Queue is full!\n");
return;
}
q->nodes[++q->rear] = node;
}
// 出队操作
TreeNode* dequeue(Queue* q) {
if (q->front == -1) {
printf("Queue is empty!\n");
return NULL;
}
TreeNode* node = q->nodes[q->front++];
return node;
}
// 层次遍历,检查是否为完全二叉树
int isCompleteBinaryTree(TreeNode* root) {
Queue* q = initQueue(10); // 预估最大层数
enqueue(q, root);
while (!isEmpty(q)) {
TreeNode* current = dequeue(q);
if (current != NULL) {
if (current->left != NULL && current->right != NULL) {
enqueue(q, current->left);
enqueue(q, current->right);
} else {
if (current->left != NULL || current->right != NULL) {
free(current);
return 0; // 如果左或右存在但另一个不存在,则不是完全二叉树
}
}
} else {
if (q->front != q->rear) {
return 0; // 若当前层非空,则不是完全二叉树
}
}
}
free(q->nodes);
free(q);
return 1; // 所有层都是满的,说明是完全二叉树
}
// 主函数
int main() {
// 假设你已经有一个二叉树根节点root
TreeNode* root = ...; // 你需要提供实际的二叉树根节点
if (isCompleteBinaryTree(root)) {
printf("The binary tree is a complete binary tree.\n");
} else {
printf("The binary tree is not a complete binary tree.\n");
}
return 0;
}
```
这个程序会先初始化一个队列,然后按照层次顺序将节点加入队列。如果在某个层次节点的数量少于其应该有的节点数,即不是满的,那么就直接返回false,表示这不是一个完全二叉树。如果遍历完整棵树,队列始终是满的,才返回true。
阅读全文