以二叉链表作为二叉树的存储结构,编写用层次顺序遍历二叉树的方法,统计树中度为1 的结点个数。用c语言怎么写
时间: 2023-06-16 08:02:36 浏览: 94
编写采用二叉链表形式存储的二叉树的创建、先序、中序、后序和按层遍历的算法
5星 · 资源好评率100%
以下是用C语言实现层次遍历并统计度为1的节点数量的代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 二叉树的结构体
typedef struct Node {
int data; // 数据
struct Node* left; // 左子节点
struct Node* right; // 右子节点
} Node;
// 队列的结构体
typedef struct Queue {
Node* data[100]; // 存储节点指针的数组
int front; // 队头
int rear; // 队尾
} Queue;
// 初始化队列
void initQueue(Queue* q) {
q->front = 0;
q->rear = 0;
}
// 判断队列是否为空
int isQueueEmpty(Queue* q) {
return q->front == q->rear;
}
// 入队
void enqueue(Queue* q, Node* node) {
q->data[q->rear++] = node;
}
// 出队
Node* dequeue(Queue* q) {
return q->data[q->front++];
}
// 层次遍历
void levelOrderTraversal(Node* root, int* count) {
Queue q;
initQueue(&q);
enqueue(&q, root);
while (!isQueueEmpty(&q)) {
Node* node = dequeue(&q);
if (node->left != NULL) {
enqueue(&q, node->left);
}
if (node->right != NULL) {
enqueue(&q, node->right);
}
// 统计度为1的节点数量
if ((node->left != NULL && node->right == NULL) || (node->left == NULL && node->right != NULL)) {
(*count)++;
}
}
}
// 创建二叉树
Node* createBinaryTree() {
int data;
scanf("%d", &data);
if (data == -1) {
return NULL;
}
Node* root = (Node*)malloc(sizeof(Node));
root->data = data;
root->left = createBinaryTree();
root->right = createBinaryTree();
return root;
}
int main() {
Node* root = createBinaryTree();
int count = 0;
levelOrderTraversal(root, &count);
printf("度为1的节点数量为:%d\n", count);
return 0;
}
```
在上述代码中,我们使用了二叉树的结构体`Node`和队列的结构体`Queue`,以及初始化队列、判断队列是否为空、入队和出队等基本操作的函数。
在主函数中,我们首先通过`createBinaryTree`函数创建了一颗二叉树,然后通过`levelOrderTraversal`函数进行层次遍历,并在遍历的过程中统计了度为1的节点数量,最后输出结果。
阅读全文