用C语言实现二叉树的非递归遍历,输入二叉树后,输出层次遍历结果
时间: 2024-03-01 17:09:01 浏览: 80
二叉树的非递归遍历C语言
好的,以下是用C语言实现二叉树的非递归遍历,输出层次遍历结果的代码:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node* left;
struct Node* right;
} Node;
typedef struct Queue {
Node** array;
int front;
int rear;
int size;
} Queue;
Queue* createQueue(int size) {
Queue* queue = (Queue*)malloc(sizeof(Queue));
queue->array = (Node**)malloc(sizeof(Node*) * size);
queue->front = 0;
queue->rear = -1;
queue->size = size;
return queue;
}
void enqueue(Queue* queue, Node* node) {
if (queue->rear == queue->size - 1) {
printf("Queue is full\n");
return;
}
queue->rear++;
queue->array[queue->rear] = node;
}
Node* dequeue(Queue* queue) {
if (queue->front > queue->rear) {
printf("Queue is empty\n");
return NULL;
}
Node* node = queue->array[queue->front];
queue->front++;
return node;
}
Node* createNode(int data) {
Node* node = (Node*)malloc(sizeof(Node));
node->data = data;
node->left = NULL;
node->right = NULL;
return node;
}
void insertNode(Node** root, int data) {
if (*root == NULL) {
*root = createNode(data);
return;
}
Queue* queue = createQueue(100);
enqueue(queue, *root);
while (1) {
Node* node = dequeue(queue);
if (node == NULL) {
enqueue(queue, createNode(data));
break;
}
if (node->left != NULL) {
enqueue(queue, node->left);
} else {
node->left = createNode(data);
break;
}
if (node->right != NULL) {
enqueue(queue, node->right);
} else {
node->right = createNode(data);
break;
}
}
}
void levelOrderTraversal(Node* root) {
if (root == NULL) {
printf("Tree is empty\n");
return;
}
Queue* queue = createQueue(100);
enqueue(queue, root);
while (queue->front <= queue->rear) {
Node* node = dequeue(queue);
printf("%d ", node->data);
if (node->left != NULL) {
enqueue(queue, node->left);
}
if (node->right != NULL) {
enqueue(queue, node->right);
}
}
}
int main() {
Node* root = NULL;
insertNode(&root, 1);
insertNode(&root, 2);
insertNode(&root, 3);
insertNode(&root, 4);
insertNode(&root, 5);
insertNode(&root, 6);
insertNode(&root, 7);
printf("Level order traversal: ");
levelOrderTraversal(root);
return 0;
}
```
这个程序中,我们定义了一个`Node`结构体,表示二叉树节点,包含一个整型数据`data`以及左右子节点的指针。我们还定义了一个`Queue`结构体,表示队列,包含一个`Node`类型的数组,以及队首、队尾、队列大小等信息。`createQueue`函数用于创建一个指定大小的队列,`enqueue`函数用于将一个节点入队,`dequeue`函数用于将队首节点出队。`createNode`函数用于创建一个值为`data`的节点。`insertNode`函数用于将一个值为`data`的节点插入二叉树中。`levelOrderTraversal`函数用于进行层次遍历,并输出遍历结果。
在`main`函数中,我们创建一个空的二叉树,并依次插入值为1到7的节点。然后调用`levelOrderTraversal`函数进行层次遍历,并输出结果。
希望这个程序能够解决你的问题!
阅读全文