使用C语言以二叉链表作为二叉树的存储结构,编写用层次顺序遍历二叉树的方法,统计树中度为1 的结点个数
时间: 2023-06-14 20:06:15 浏览: 114
二叉树的层次遍历 c语言 算法 数据结构
5星 · 资源好评率100%
以下是使用C语言以二叉链表作为二叉树的存储结构,编写用层次顺序遍历二叉树的方法,统计树中度为1 的结点个数的代码。
```
#include <stdio.h>
#include <stdlib.h>
// 定义二叉树结点的结构体
typedef struct TreeNode {
int data;
struct TreeNode* left;
struct TreeNode* right;
} TreeNode;
// 定义队列结点的结构体
typedef struct QueueNode {
TreeNode* data;
struct QueueNode* next;
} QueueNode;
// 定义队列的结构体
typedef struct Queue {
QueueNode* front;
QueueNode* rear;
} Queue;
// 初始化队列
void initQueue(Queue* queue) {
queue->front = NULL;
queue->rear = NULL;
}
// 判断队列是否为空
int isQueueEmpty(Queue* queue) {
return queue->front == NULL;
}
// 入队
void enqueue(Queue* queue, TreeNode* data) {
QueueNode* newNode = (QueueNode*)malloc(sizeof(QueueNode));
newNode->data = data;
newNode->next = NULL;
if (isQueueEmpty(queue)) {
queue->front = newNode;
queue->rear = newNode;
} else {
queue->rear->next = newNode;
queue->rear = newNode;
}
}
// 出队
TreeNode* dequeue(Queue* queue) {
if (isQueueEmpty(queue)) {
printf("Queue is empty!\n");
return NULL;
} else {
TreeNode* data = queue->front->data;
QueueNode* temp = queue->front;
queue->front = queue->front->next;
free(temp);
return data;
}
}
// 层次顺序遍历二叉树
void levelOrderTraversal(TreeNode* root, int* count) {
if (root == NULL) {
return;
}
Queue queue;
initQueue(&queue);
enqueue(&queue, root);
while (!isQueueEmpty(&queue)) {
TreeNode* node = dequeue(&queue);
if (node->left != NULL) {
enqueue(&queue, node->left);
}
if (node->right != NULL) {
enqueue(&queue, node->right);
}
if ((node->left == NULL && node->right != NULL) || (node->left != NULL && node->right == NULL)) {
(*count)++;
}
printf("%d ", node->data);
}
}
int main() {
// 构造二叉树
TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode));
root->data = 1;
TreeNode* node1 = (TreeNode*)malloc(sizeof(TreeNode));
node1->data = 2;
TreeNode* node2 = (TreeNode*)malloc(sizeof(TreeNode));
node2->data = 3;
TreeNode* node3 = (TreeNode*)malloc(sizeof(TreeNode));
node3->data = 4;
TreeNode* node4 = (TreeNode*)malloc(sizeof(TreeNode));
node4->data = 5;
root->left = node1;
root->right = node2;
node1->left = node3;
node1->right = NULL;
node2->left = NULL;
node2->right = node4;
node3->left = NULL;
node3->right = NULL;
node4->left = NULL;
node4->right = NULL;
int count = 0;
levelOrderTraversal(root, &count);
printf("\nNumber of nodes with degree 1: %d\n", count);
return 0;
}
```
运行结果:
```
1 2 3 4 5
Number of nodes with degree 1: 2
```
在该代码中,我们使用了一个队列来存储二叉树中的结点,实现了层次顺序遍历。在遍历过程中,我们判断每个结点的左右子树是否为空,如果有一个为空,就说明该结点的度为1,将计数器加1。最后输出计数器的值即为树中度为1的结点个数。
阅读全文