先序遍历:遍历顺序规则为【根左右】
中序遍历:遍历顺序规则为【左根右】
后序遍历:遍历顺序规则为【左右根】
什么是【根左右】?就是先遍历根,再遍历左孩子,最后遍历右孩子;
#include<stdio.h> // 引入标准输入输出库
#include<string.h> // 引入字符串处理库
#include<stdlib.h> // 引入标准库,包含malloc和free函数
// 定义二叉树结构体
typedef struct tree {
char data; // 数据域
struct tree* left; // 左子树指针
struct tree* right; // 右子树指针
}Tree;
// 初始化二叉树
Tree* init()
{
Tree* t = NULL; // 创建一个空指针
t = (Tree*)malloc(sizeof(Tree)); // 为指针分配内存空间
t->left = t->right = NULL; // 初始化左右子树为空
memset(&t->data, 0, sizeof(t->data)); // 将数据域清零
return t; // 返回指向新创建的二叉树的指针
}
// 前序遍历二叉树
void pre_order(Tree* t)
{
if (t == NULL) // 如果当前节点为空,直接返回
{
return;
}
else {
printf("%c ", t->data); // 打印当前节点的数据
pre_order(t->left); // 递归遍历左子树
pre_order(t->right); // 递归遍历右子树
}
}
// 中序遍历二叉树
void middle_order(Tree* t)
{
if (t == NULL) // 如果当前节点为空,直接返回
{
return;
}
else {
middle_order(t->left); // 递归遍历左子树
printf("%c ", t->data); // 打印当前节点的数据
middle_order(t->right); // 递归遍历右子树
}
}
// 后序遍历二叉树
void post_order(Tree* t)
{
if (t == NULL) // 如果当前节点为空,直接返回
{
return;
}
else {
post_order(t->left); // 递归遍历左子树
post_order(t->right); // 递归遍历右子树
printf("%c ", t->data); // 打印当前节点的数据
}
}
// 主函数
int main()
{
Tree* root = NULL; // 创建一个空指针,用于存储二叉树的根节点
root = init(); // 初始化二叉树,根节点为空
root = Root(root); // 创建二叉树,根节点为之前创建的二叉树的根节点
pre_order(root); // 前序遍历二叉树
printf("\n"); // 打印换行符,使输出更美观
middle_order(root); // 中序遍历二叉树
printf("\n"); // 打印换行符,使输出更美观
post_order(root); // 后序遍历二叉树
}
创建二叉树,结构如下图(图从网上找的)
// 创建二叉树的根节点
Tree* Root(Tree* t)
{
Tree* l = t; // 创建两个临时指针l和r,指向传入的二叉树的根节点
Tree* r = t;
l->data = 'A'; // 设置左子树的根节点的值为'A'
Tree* node = NULL; // 创建一个临时指针node,用于创建新的节点
int i = 1;
node = init(); // 创建新的节点,并初始化
node->data = 'B'; // 设置新节点的数据为'B'
l->left = node; // 将新节点设置为左子树的根节点
l = node; // 更新临时指针l,使其指向新创建的节点
node = init(); // 创建新的节点,并初始化
node->data = 'C'; // 设置新节点的数据为'C'
l->right = node; // 将新节点设置为左子树的根节点
l = node; // 更新临时指针l,使其指向新创建的节点
node = init(); // 创建新的节点,并初始化
node->data = 'D'; // 设置新节点的数据为'D'
l->left = node; // 将新节点设置为左子树的根节点
node = init(); // 创建新的节点,并初始化
node->data = 'E'; // 设置新节点的数据为'E'
r->right = node; // 将新节点设置为右子树的根节点
r = node; // 更新临时指针r,使其指向新创建的节点
node = init(); // 创建新的节点,并初始化
node->data = 'F'; // 设置新节点的数据为'F'
r->right = node; // 将新节点设置为右子树的根节点
r = node; // 更新临时指针r,使其指向新创建的节点
node = init(); // 创建新的节点,并初始化
node->data = 'G'; // 设置新节点的数据为'G'
r->left = node; // 将新节点设置为右子树的根节点
r = node; // 更新临时指针r,使其指向新创建的节点
node = init(); // 创建新的节点,并初始化
node->data = 'H'; // 设置新节点的数据为'H'
r->left = node; // 将新节点设置为右子树的根节点
node = init(); // 创建新的节点,并初始化
node->data = 'K'; // 设置新节点的数据为'K'
r->right = node; // 将新节点设置为右子树的根节点
return t; // 返回指向新创建的二叉树的根节点的指针
}