C语言如何实现层序遍历
时间: 2024-05-01 09:18:58 浏览: 39
在C语言中,可以通过队列来实现二叉树的层序遍历。具体实现步骤如下:
1. 定义一个队列,用于存储待遍历的节点。
2. 将二叉树的根节点入队。
3. 循环执行以下操作,直到队列为空:
a. 将队首节点出队,并访问该节点。
b. 如果该节点有左子节点,则将左子节点入队。
c. 如果该节点有右子节点,则将右子节点入队。
4. 遍历结束。
下面是C语言的代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
// 二叉树节点结构体
typedef struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode;
// 队列节点结构体
typedef struct QueueNode {
TreeNode *node;
struct QueueNode *next;
} QueueNode;
// 队列结构体
typedef struct Queue {
QueueNode *front;
QueueNode *rear;
} Queue;
// 创建队列节点
QueueNode *createQueueNode(TreeNode *node) {
QueueNode *queueNode = (QueueNode*)malloc(sizeof(QueueNode));
queueNode->node = node;
queueNode->next = NULL;
return queueNode;
}
// 创建队列
Queue *createQueue() {
Queue *queue = (Queue*)malloc(sizeof(Queue));
queue->front = queue->rear = NULL;
return queue;
}
// 入队
void enqueue(Queue *queue, TreeNode *node) {
QueueNode *queueNode = createQueueNode(node);
if (queue->rear == NULL) {
queue->front = queue->rear = queueNode;
return;
}
queue->rear->next = queueNode;
queue->rear = queueNode;
}
// 出队
TreeNode *dequeue(Queue *queue) {
if (queue->front == NULL) {
return NULL;
}
QueueNode *queueNode = queue->front;
queue->front = queue->front->next;
if (queue->front == NULL) {
queue->rear = NULL;
}
TreeNode *node = queueNode->node;
free(queueNode);
return node;
}
// 创建二叉树
TreeNode *createBinaryTree() {
int val;
scanf("%d", &val);
if (val == -1) {
return NULL;
}
TreeNode *root = (TreeNode*)malloc(sizeof(TreeNode));
root->val = val;
root->left = createBinaryTree();
root->right = createBinaryTree();
return root;
}
// 层序遍历
void levelOrder(TreeNode *root) {
if (root == NULL) {
return;
}
Queue *queue = createQueue();
enqueue(queue, root);
while (queue->front != NULL) {
TreeNode *node = dequeue(queue);
printf("%d ", node->val);
if (node->left != NULL) {
enqueue(queue, node->left);
}
if (node->right != NULL) {
enqueue(queue, node->right);
}
}
}
int main() {
TreeNode *root = createBinaryTree();
levelOrder(root);
return 0;
}
```
在上面的代码中,我们定义了一个二叉树节点结构体和一个队列节点结构体。然后,我们实现了创建队列节点、创建队列、入队、出队等函数。最后,我们在主函数中先创建二叉树,然后调用层序遍历函数输出遍历结果。
阅读全文