帮我用C语言写一个三叉树的广度优先遍历函数
时间: 2023-06-10 08:08:03 浏览: 134
C例子: 广度优先遍历
下面是一个简单的三叉树的广度优先遍历函数的实现,使用了队列来辅助遍历:
```c
#include <stdio.h>
#include <stdlib.h>
// 三叉树的节点结构体
struct Node {
int data;
struct Node* left;
struct Node* middle;
struct Node* right;
};
// 队列节点结构体
struct QueueNode {
struct Node* node;
struct QueueNode* next;
};
// 队列结构体
struct Queue {
struct QueueNode* front;
struct QueueNode* rear;
};
// 创建节点
struct Node* createNode(int data) {
struct Node* node = (struct Node*)malloc(sizeof(struct Node));
node->data = data;
node->left = NULL;
node->middle = NULL;
node->right = NULL;
return node;
}
// 创建队列
struct Queue* createQueue() {
struct Queue* queue = (struct Queue*)malloc(sizeof(struct Queue));
queue->front = NULL;
queue->rear = NULL;
return queue;
}
// 判断队列是否为空
int isEmptyQueue(struct Queue* queue) {
return queue->front == NULL;
}
// 入队
void enqueue(struct Queue* queue, struct Node* node) {
struct QueueNode* queueNode = (struct QueueNode*)malloc(sizeof(struct QueueNode));
queueNode->node = node;
queueNode->next = NULL;
if (isEmptyQueue(queue)) {
queue->front = queueNode;
queue->rear = queueNode;
} else {
queue->rear->next = queueNode;
queue->rear = queueNode;
}
}
// 出队
struct Node* dequeue(struct Queue* queue) {
if (isEmptyQueue(queue)) {
return NULL;
}
struct QueueNode* queueNode = queue->front;
struct Node* node = queueNode->node;
queue->front = queueNode->next;
if (queue->front == NULL) {
queue->rear = NULL;
}
free(queueNode);
return node;
}
// 三叉树的广度优先遍历
void breadthFirstTraversal(struct Node* root) {
if (root == NULL) {
return;
}
struct Queue* queue = createQueue();
enqueue(queue, root);
while (!isEmptyQueue(queue)) {
struct Node* node = dequeue(queue);
printf("%d ", node->data);
if (node->left != NULL) {
enqueue(queue, node->left);
}
if (node->middle != NULL) {
enqueue(queue, node->middle);
}
if (node->right != NULL) {
enqueue(queue, node->right);
}
}
}
int main() {
// 创建一个三叉树
struct Node* root = createNode(1);
root->left = createNode(2);
root->middle = createNode(3);
root->right = createNode(4);
root->left->left = createNode(5);
root->left->middle = createNode(6);
root->left->right = createNode(7);
root->middle->left = createNode(8);
root->middle->middle = createNode(9);
root->middle->right = createNode(10);
root->right->left = createNode(11);
root->right->middle = createNode(12);
root->right->right = createNode(13);
// 广度优先遍历三叉树
printf("Breadth First Traversal: ");
breadthFirstTraversal(root);
printf("\n");
return 0;
}
```
这个程序中,我们首先定义了三叉树节点的结构体 `Node` 和队列节点的结构体 `QueueNode`,以及队列的结构体 `Queue`。然后,我们实现了创建节点的函数 `createNode`、创建队列的函数 `createQueue`、判断队列是否为空的函数 `isEmptyQueue`、入队的函数 `enqueue`、出队的函数 `dequeue`,以及三叉树的广度优先遍历函数 `breadthFirstTraversal`。在 `breadthFirstTraversal` 函数中,我们先创建一个队列,将根节点入队,然后循环执行以下操作:出队一个节点,打印该节点的值,将该节点的左、中、右三个子节点依次入队。由于广度优先遍历是逐层遍历的,所以使用队列来辅助遍历非常方便。最后,在 `main` 函数中,我们创建了一个三叉树,并调用 `breadthFirstTraversal` 函数来进行广度优先遍历。
阅读全文