以二叉链表作为二叉树的存储结构,编写用层次顺序遍历二叉树的方法,统计树中度为1 的结点个数。用c语言实现
时间: 2023-06-13 14:08:01 浏览: 90
以下是用 C 语言实现的代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义二叉树结点结构体
typedef struct TreeNode {
int data;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode;
// 定义队列结构体
typedef struct Queue {
int front;
int rear;
int size;
TreeNode **data;
} Queue;
// 初始化队列
Queue *initQueue(int size) {
Queue *queue = (Queue *) malloc(sizeof(Queue));
queue->front = 0;
queue->rear = 0;
queue->size = size;
queue->data = (TreeNode **) malloc(sizeof(TreeNode *) * size);
return queue;
}
// 判断队列是否为空
int isEmpty(Queue *queue) {
return queue->front == queue->rear;
}
// 判断队列是否已满
int isFull(Queue *queue) {
return (queue->rear + 1) % queue->size == queue->front;
}
// 入队
void enqueue(Queue *queue, TreeNode *node) {
if (isFull(queue)) {
printf("Queue is full.\n");
return;
}
queue->data[queue->rear] = node;
queue->rear = (queue->rear + 1) % queue->size;
}
// 出队
TreeNode *dequeue(Queue *queue) {
if (isEmpty(queue)) {
printf("Queue is empty.\n");
return NULL;
}
TreeNode *node = queue->data[queue->front];
queue->front = (queue->front + 1) % queue->size;
return node;
}
// 层次顺序遍历二叉树,并统计度为 1 的结点数量
int levelOrderTraversal(TreeNode *root) {
if (root == NULL) {
return 0;
}
Queue *queue = initQueue(100);
enqueue(queue, root);
int count = 0;
while (!isEmpty(queue)) {
TreeNode *node = dequeue(queue);
if (node->left != NULL && node->right == NULL) {
count++;
}
if (node->left == NULL && node->right != NULL) {
count++;
}
if (node->left != NULL) {
enqueue(queue, node->left);
}
if (node->right != NULL) {
enqueue(queue, node->right);
}
}
return count;
}
int main() {
// 创建二叉树
TreeNode *root = (TreeNode *) malloc(sizeof(TreeNode));
root->data = 1;
root->left = (TreeNode *) malloc(sizeof(TreeNode));
root->left->data = 2;
root->left->left = NULL;
root->left->right = (TreeNode *) malloc(sizeof(TreeNode));
root->left->right->data = 3;
root->left->right->left = NULL;
root->left->right->right = NULL;
root->right = (TreeNode *) malloc(sizeof(TreeNode));
root->right->data = 4;
root->right->left = NULL;
root->right->right = NULL;
// 层次顺序遍历二叉树,并统计度为 1 的结点数量
int count = levelOrderTraversal(root);
printf("The number of nodes with degree 1 is %d.\n", count);
return 0;
}
```
这里的 `levelOrderTraversal` 方法首先初始化一个队列,将根结点入队。然后,每次从队列中取出一个结点,如果该结点的左子树非空而右子树为空,或者左子树为空而右子树非空,则该结点是度为 1 的结点,统计数量。接着,将该结点的左右子树入队。重复上述过程,直到队列为空。最后,返回度为 1 的结点数量。
阅读全文