建立一棵用二叉链表方式存储的二叉树,并实现对其进行先序、中序、后序三种方法遍历,输出遍历结果。C语言
时间: 2023-11-27 17:05:30 浏览: 175
编写采用二叉链表形式存储的二叉树的创建、先序、中序、后序和按层遍历的算法
5星 · 资源好评率100%
好的,下面是代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
// 二叉树结点结构体
typedef struct TreeNode {
char data; // 数据域
struct TreeNode *lchild; // 左孩子指针
struct TreeNode *rchild; // 右孩子指针
} TreeNode;
// 创建二叉树
TreeNode* createBinaryTree() {
char data;
scanf("%c", &data); // 读入结点数据
if (data == '#') { // 如果是叶子结点,返回 NULL
return NULL;
}
// 动态申请一个结点空间
TreeNode *node = (TreeNode*)malloc(sizeof(TreeNode));
node->data = data; // 将数据存储到结点中
node->lchild = createBinaryTree(); // 递归创建左子树
node->rchild = createBinaryTree(); // 递归创建右子树
return node; // 返回根结点
}
// 先序遍历
void preOrderTraversal(TreeNode *root) {
if (root == NULL) {
return;
}
printf("%c ", root->data); // 访问根结点
preOrderTraversal(root->lchild); // 递归遍历左子树
preOrderTraversal(root->rchild); // 递归遍历右子树
}
// 中序遍历
void inOrderTraversal(TreeNode *root) {
if (root == NULL) {
return;
}
inOrderTraversal(root->lchild); // 递归遍历左子树
printf("%c ", root->data); // 访问根结点
inOrderTraversal(root->rchild); // 递归遍历右子树
}
// 后序遍历
void postOrderTraversal(TreeNode *root) {
if (root == NULL) {
return;
}
postOrderTraversal(root->lchild); // 递归遍历左子树
postOrderTraversal(root->rchild); // 递归遍历右子树
printf("%c ", root->data); // 访问根结点
}
int main() {
printf("请输入二叉树的结点(叶子结点用 # 表示):\n");
TreeNode *root = createBinaryTree(); // 创建二叉树
printf("先序遍历结果:");
preOrderTraversal(root); // 先序遍历
printf("\n中序遍历结果:");
inOrderTraversal(root); // 中序遍历
printf("\n后序遍历结果:");
postOrderTraversal(root); // 后序遍历
printf("\n");
return 0;
}
```
以上代码中,我们使用了递归的方法来实现二叉树的创建和遍历。在创建二叉树时,我们递归读入每个结点的数据,并根据数据是否为 '#' 来判断是否为叶子结点。在遍历二叉树时,我们按照先序、中序、后序的顺序递归遍历左子树、右子树和根结点,并在访问根结点时输出对应的数据。
阅读全文