C语言用数组构建一颗二叉树,并分别完成前序遍历,中序遍历,后续遍历,层序遍历后输出遍历结果每一步带注释
时间: 2024-05-04 07:16:14 浏览: 98
好的,您的要求已经记录下来了。现在,让我来回答您的问题。
以下是使用 C 语言构建二叉树并完成各种遍历的代码,已经添加了注释:
```
#include <stdio.h>
#include <stdlib.h>
// 二叉树结构体
typedef struct Node {
int value; // 值
struct Node *left; // 左子节点
struct Node *right; // 右子节点
} Node;
// 层序遍历用到的队列结构体
typedef struct Queue {
Node *data[1000]; // 定义一个数组作为队列
int head, tail; // 队列头和尾
} Queue;
// 初始化队列
void init_queue(Queue *q) {
q->head = 0;
q->tail = 0;
}
// 入队
void enqueue(Queue *q, Node *n) {
q->data[q->tail++] = n;
}
// 出队
Node *dequeue(Queue *q) {
return q->data[q->head++];
}
// 判断队列是否为空
int is_queue_empty(Queue *q) {
return q->head == q->tail;
}
// 创建一个新节点
Node *create_node(int value) {
Node *new_node = (Node*) malloc(sizeof(Node));
new_node->value = value;
new_node->left = NULL;
new_node->right = NULL;
return new_node;
}
// 插入节点到二叉树中
void insert_node(Node **root, int value) {
if (*root == NULL) { // 如果根节点为空,插入到根节点
*root = create_node(value);
} else if (value < (*root)->value) { // 如果插入的值小于根节点的值,则插入到左子树中
insert_node(&((*root)->left), value);
} else { // 如果插入的值大于等于根节点的值,插入到右子树中
insert_node(&((*root)->right), value);
}
}
// 前序遍历
void preorder_traversal(Node *root) {
if (root != NULL) {
printf("%d ", root->value);
preorder_traversal(root->left);
preorder_traversal(root->right);
}
}
// 中序遍历
void inorder_traversal(Node *root) {
if (root != NULL) {
inorder_traversal(root->left);
printf("%d ", root->value);
inorder_traversal(root->right);
}
}
// 后序遍历
void postorder_traversal(Node *root) {
if (root != NULL) {
postorder_traversal(root->left);
postorder_traversal(root->right);
printf("%d ", root->value);
}
}
// 层序遍历
void levelorder_traversal(Node *root) {
Queue q;
init_queue(&q);
if (root != NULL) {
enqueue(&q, root); // 根节点入队
while (!is_queue_empty(&q)) {
Node *node = dequeue(&q); // 出队
printf("%d ", node->value); // 输出节点值
// 将左右子节点入队
if (node->left != NULL) {
enqueue(&q, node->left);
}
if (node->right != NULL) {
enqueue(&q, node->right);
}
}
}
}
int main() {
Node *root = NULL; // 初始化根节点为空
int arr[] = {5, 3, 7, 2, 4, 6, 8};
int len = sizeof(arr) / sizeof(arr[0]);
for (int i = 0; i < len; i++) {
insert_node(&root, arr[i]); // 将数组中的元素插入到二叉树中
}
printf("前序遍历:");
preorder_traversal(root);
printf("\n中序遍历:");
inorder_traversal(root);
printf("\n后序遍历:");
postorder_traversal(root);
printf("\n层序遍历:");
levelorder_traversal(root);
printf("\n");
return 0;
}
```
上述代码中,使用了递归的方式,通过不断判断节点的值来将节点插入到左子树或右子树中,从而构建出一颗二叉树。同时,还实现了前序、中序、后序和层序遍历,并在主函数中调用输出每种遍历方式的结果。
希望这个回答对您有所帮助!
阅读全文