二叉树的层次遍历非递归c语言
时间: 2023-09-21 19:08:05 浏览: 61
二叉树的层次遍历可以借助队列来实现非递归算法。具体步骤如下:
1. 定义一个队列,初始时将根节点入队。
2. 循环进行以下操作,直到队列为空:
a. 将队首元素出队并访问。
b. 如果该节点的左子节点非空,则将左子节点入队。
c. 如果该节点的右子节点非空,则将右子节点入队。
下面是实现二叉树层次遍历的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, *rear;
} Queue;
// 创建二叉树节点
TreeNode* createNode(int val) {
TreeNode *node = (TreeNode*)malloc(sizeof(TreeNode));
node->val = val;
node->left = NULL;
node->right = NULL;
return node;
}
// 入队
void enqueue(Queue *queue, TreeNode *node) {
QueueNode *newNode = (QueueNode*)malloc(sizeof(QueueNode));
newNode->node = node;
newNode->next = NULL;
if (queue->rear == NULL) {
queue->front = newNode;
queue->rear = newNode;
} else {
queue->rear->next = newNode;
queue->rear = newNode;
}
}
// 出队
TreeNode* dequeue(Queue *queue) {
if (queue->front == NULL) {
return NULL;
}
QueueNode *node = queue->front;
queue->front = node->next;
if (node == queue->rear) {
queue->rear = NULL;
}
TreeNode *treeNode = node->node;
free(node);
return treeNode;
}
// 层次遍历(非递归)
void levelOrder(TreeNode *root) {
if (root == NULL) {
return;
}
Queue *queue = (Queue*)malloc(sizeof(Queue));
queue->front = NULL;
queue->rear = NULL;
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 = createNode(1);
root->left = createNode(2);
root->right = createNode(3);
root->left->left = createNode(4);
root->left->right = createNode(5);
// 层次遍历
levelOrder(root);
printf("\n");
return 0;
}
```