用C语言写一个程序,要求体现二叉树的先序中序后序、层次遍历
时间: 2024-10-25 12:17:36 浏览: 28
二叉树的非递归先序中序后序(数据结构和算法分析)
在C语言中,我们可以使用结构体来表示二叉树节点,并结合递归和队列来实现先序遍历(根-左-右)、中序遍历(左-根-右)和后序遍历(左-右-根)。这里给出一个简单的示例:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义二叉树节点结构
typedef struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode;
// 先序遍历函数
void preorderTraversal(TreeNode* root) {
if (root != NULL) {
printf("%d ", root->val); // 打印当前节点
preorderTraversal(root->left); // 遍历左子树
preorderTraversal(root->right); // 遍历右子树
}
}
// 中序遍历函数
void inorderTraversal(TreeNode* root) {
if (root != NULL) {
inorderTraversal(root->left); // 遍历左子树
printf("%d ", root->val); // 打印当前节点
inorderTraversal(root->right); // 遍历右子树
}
}
// 后序遍历函数
void postorderTraversal(TreeNode* root) {
if (root != NULL) {
postorderTraversal(root->left); // 遍历左子树
postorderTraversal(root->right); // 遍历右子树
printf("%d ", root->val); // 打印当前节点
}
}
// 层次遍历函数(使用广度优先搜索)
void levelOrderTraversal(TreeNode* root) {
if (root == NULL) return;
Queue* q = createQueue(); // 创建空队列
enqueue(q, root); // 入队头结点
while (!isEmpty(q)) {
TreeNode* node = dequeue(q);
printf("%d ", node->val); // 输出当前层节点
if (node->left) enqueue(q, node->left);
if (node->right) enqueue(q, node->right);
}
destroyQueue(q);
}
// 示例主函数
int main() {
// 构建一个简单二叉树
TreeNode* tree = malloc(sizeof(TreeNode));
tree->val = 1;
tree->left = malloc(sizeof(TreeNode));
tree->left->val = 2;
tree->left->left = NULL;
tree->left->right = NULL;
tree->right = malloc(sizeof(TreeNode));
tree->right->val = 3;
tree->right->left = NULL;
tree->right->right = NULL;
printf("Preorder traversal: ");
preorderTraversal(tree);
printf("\nInorder traversal: ");
inorderTraversal(tree);
printf("\nPostorder traversal: ");
postorderTraversal(tree);
printf("\nLevel Order traversal: ");
levelOrderTraversal(tree);
free(tree); // 释放内存
return 0;
}
```
上述代码首先定义了二叉树的节点结构,然后分别实现了四种遍历方法。`levelOrderTraversal` 函数使用队列实现了层次遍历。
阅读全文