链式二叉树如何用C语言实现按层次遍历,即按层从小到大,从左到右,非递归实现
时间: 2024-12-04 14:26:42 浏览: 8
在C语言中,非递归实现链式二叉树的层次遍历(也叫广度优先搜索BFS)可以使用队列数据结构。以下是一个简单示例:
首先,我们需要定义二叉树节点和队列结构:
```c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
typedef struct Node {
int data;
struct Node* left;
struct Node* right;
} Node;
typedef struct QueueNode {
Node* data;
struct QueueNode* next;
} QueueNode, *Queue;
struct Queue {
QueueNode* front;
QueueNode* rear;
};
```
然后实现初始化、入队、出队和删除队列元素等操作:
```c
void enqueue(Queue* queue, Node* node) {
QueueNode* newNode = (QueueNode*)malloc(sizeof(QueueNode));
newNode->data = node;
newNode->next = NULL;
if (queue->front == NULL) {
queue->front = newNode;
queue->rear = newNode;
} else {
queue->rear->next = newNode;
queue->rear = newNode;
}
}
Node* dequeue(Queue* queue) {
if (queue->front == NULL) {
return NULL;
}
Node* temp = queue->front->data;
queue->front = queue->front->next;
if (queue->front == NULL) {
queue->rear = NULL;
}
free(temp);
return temp;
}
```
最后,实现层次遍历:
```c
void levelOrderTraversal(Node* root) {
if (root == NULL) {
return;
}
Queue q = { .front = NULL, .rear = NULL };
enqueue(&q, root);
while (!queue.empty()) {
Node* node = dequeue(&q);
printf("%d ", node->data); // 打印当前层节点
if (node->left != NULL) {
enqueue(&q, node->left);
}
if (node->right != NULL) {
enqueue(&q, node->right);
}
}
}
```
这里假设有一个`empty()`函数检查队列是否为空。
阅读全文