c 语言用队列实现二叉树的层次遍历算法,并按层次输出(标出层号),并能统计树叶数,结点数,层高等信息。
时间: 2024-05-01 18:21:17 浏览: 14
下面是用队列实现二叉树的层次遍历算法的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 二叉树结点结构体
typedef struct TreeNode {
int data; // 数据域
struct TreeNode* left; // 左子树指针
struct TreeNode* right; // 右子树指针
} TreeNode;
// 队列结构体
typedef struct Queue {
TreeNode** data; // 存放指向结点的指针的数组
int front; // 队头指针
int rear; // 队尾指针
int size; // 队列大小
} Queue;
// 创建二叉树
TreeNode* createTree() {
int data;
scanf("%d", &data);
if (data == -1) { // 如果输入-1,说明该结点为NULL
return NULL;
}
TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode));
root->data = data;
root->left = createTree();
root->right = createTree();
return root;
}
// 初始化队列
Queue* initQueue(int size) {
Queue* q = (Queue*)malloc(sizeof(Queue));
q->data = (TreeNode**)malloc(size * sizeof(TreeNode*));
q->front = q->rear = 0;
q->size = size;
return q;
}
// 判断队列是否为空
int isEmpty(Queue* q) {
return q->front == q->rear;
}
// 入队
void enqueue(Queue* q, TreeNode* node) {
if ((q->rear + 1) % q->size == q->front) { // 队列已满
printf("Queue is full.\n");
return;
}
q->data[q->rear] = node;
q->rear = (q->rear + 1) % q->size;
}
// 出队
TreeNode* dequeue(Queue* q) {
if (isEmpty(q)) { // 队列为空
printf("Queue is empty.\n");
return NULL;
}
TreeNode* node = q->data[q->front];
q->front = (q->front + 1) % q->size;
return node;
}
// 层次遍历二叉树
void levelOrder(TreeNode* root) {
Queue* q = initQueue(100); // 初始化队列
enqueue(q, root); // 根结点入队
int level = 1; // 层号
int leafCount = 0; // 叶子结点个数
int nodeCount = 0; // 结点个数
int maxLevel = 0; // 树的层数
while (!isEmpty(q)) {
printf("Level %d: ", level);
int size = q->rear - q->front; // 当前层结点个数
while (size--) {
TreeNode* node = dequeue(q); // 出队
printf("%d ", node->data); // 输出结点数据
nodeCount++;
if (node->left) { // 左子树不为空,左子结点入队
enqueue(q, node->left);
}
if (node->right) { // 右子树不为空,右子结点入队
enqueue(q, node->right);
}
if (!node->left && !node->right) { // 是叶子结点
leafCount++;
}
}
printf("\n");
level++;
if (q->rear - q->front > 0) { // 如果队列不为空,说明还有下一层
maxLevel++;
}
}
printf("Number of leaf nodes: %d\n", leafCount);
printf("Number of nodes: %d\n", nodeCount);
printf("Height of the tree: %d\n", maxLevel);
}
int main() {
printf("Please input the binary tree (preorder traversal, -1 means NULL):\n");
TreeNode* root = createTree(); // 创建二叉树
printf("\nLevel order traversal:\n");
levelOrder(root); // 层次遍历二叉树
return 0;
}
```
示例输入:
```
Please input the binary tree (preorder traversal, -1 means NULL):
1 2 -1 -1 3 4 -1 -1 5 -1 -1
```
示例输出:
```
Level order traversal:
Level 1: 1
Level 2: 2 3
Level 3: 4 5
Number of leaf nodes: 2
Number of nodes: 5
Height of the tree: 2
```