对二叉树前中后序不理解的同学可以看看这个视频是我觉得目前讲的最清晰易懂的:
https://www.bilibili.com/video/BV1eT4y1N7tV?from=search&seid=16601365746333983298
我们将用递归的方式前中序的遍历出来下面的二叉树
这边代码的设定是如果左孩子或者右孩子为空的话则输入空格
接下来代码展示:
#include "stdio.h"
#include "stdlib.h"
typedef struct bitnode{ //定义二叉树节点
char data; //节点的数据为字符
struct bitnode *lchild,*rchild; //每个节点都有左孩子右孩子
}bitnode,*bittree;
void createbit(bittree *T) //创建二叉树
{
char a; //以前序遍历的顺序输入
scanf("%c",&a); //输入节点参数
if(' '==a){ //如果收到的是空格
*T=NULL; //树为空或者没输入叶子结点为空格
}
else{
*T=(bitnode *)malloc(sizeof(bitnode)); //分配动态空间
(*T)->data=a; //目前节点的数据为a
createbit(&(*T)->lchild); //递归左孩子
createbit(&(*T)->rchild); //递归右孩子
}
}
void visit(char T,int level) //访问节点输出节点数据和深度
{
printf("数据%c在第%d行\n",T,level);
}
void qianxubianli(bittree T,int level) //前序遍历二叉树
{
if(T) //如果树不为空
{
visit(T->data,level); //访问头节点
qianxubianli(T->lchild,level+1); //递归左孩子
qianxubianli(T->rchild,level+1); //递归右孩子
}
}
void zhongxubianli(bittree T,int level) //前序遍历二叉树
{
if(T) //如果树不为空
{
zhongxubianli(T->lchild,level+1); //递归左孩子
visit(T->data,level); //访问头节点
zhongxubianli(T->rchild,level+1); //递归右孩子
}
}
void houxubianli(bittree T,int level) //前序遍历二叉树
{
if(T) //如果树不为空
{
houxubianli(T->lchild,level+1); //递归左孩子
houxubianli(T->rchild,level+1); //递归右孩子
visit(T->data,level); //访问头节点
}
}
int main()
{
int level=1; //第一个节点的深度行数从1开始
bittree T=NULL; //初始化二叉树为空;
createbit(&T); //创建树插入节点及叶子
printf("前序遍历\n");
qianxubianli(T,level); //前序遍历
printf("中序遍历\n");
zhongxubianli(T,level); //中序遍历
printf("后序遍历\n");
houxubianli(T,level); //后序遍历
}
输出结果: