C语言按先序、中序、后序、层次遍历输出二叉树
时间: 2023-10-20 15:07:15 浏览: 119
以下是C语言实现二叉树的四种遍历方式:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义二叉树结构体
typedef struct TreeNode {
int val;
struct TreeNode* left;
struct TreeNode* right;
} TreeNode;
// 创建二叉树
TreeNode* createTree() {
int val;
scanf("%d", &val);
if (val == -1) { // -1表示空节点
return NULL;
} else {
TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode));
root->val = val;
root->left = createTree();
root->right = createTree();
return root;
}
}
// 先序遍历
void preorderTraversal(TreeNode* root) {
if (root == NULL) {
return;
}
printf("%d ", root->val); // 先访问根节点
preorderTraversal(root->left); // 再遍历左子树
preorderTraversal(root->right); // 最后遍历右子树
}
// 中序遍历
void inorderTraversal(TreeNode* root) {
if (root == NULL) {
return;
}
inorderTraversal(root->left); // 先遍历左子树
printf("%d ", root->val); // 再访问根节点
inorderTraversal(root->right); // 最后遍历右子树
}
// 后序遍历
void postorderTraversal(TreeNode* root) {
if (root == NULL) {
return;
}
postorderTraversal(root->left); // 先遍历左子树
postorderTraversal(root->right); // 再遍历右子树
printf("%d ", root->val); // 最后访问根节点
}
// 层次遍历
void levelorderTraversal(TreeNode* root) {
if (root == NULL) {
return;
}
TreeNode* queue[100]; // 用数组模拟队列
int front = 0, rear = 0;
queue[rear++] = root; // 根节点入队
while (front < rear) { // 队列非空时循环
TreeNode* cur = queue[front++]; // 队首出队
printf("%d ", cur->val); // 访问队首节点
if (cur->left != NULL) { // 左子节点入队
queue[rear++] = cur->left;
}
if (cur->right != NULL) { // 右子节点入队
queue[rear++] = cur->right;
}
}
}
int main() {
printf("请输入二叉树的先序遍历序列:\n");
TreeNode* root = createTree();
printf("先序遍历结果:");
preorderTraversal(root);
printf("\n");
printf("中序遍历结果:");
inorderTraversal(root);
printf("\n");
printf("后序遍历结果:");
postorderTraversal(root);
printf("\n");
printf("层次遍历结果:");
levelorderTraversal(root);
printf("\n");
return 0;
}
```
在程序运行时,先输入二叉树的先序遍历序列(例如:1 2 -1 -1 3 4 -1 -1 5 -1 -1),然后程序会自动创建二叉树,并按照先序、中序、后序和层次遍历的顺序输出二叉树的节点值。
阅读全文