如果需要讲解的小伙伴可以看这个链接https://blog.csdn.net/weixin_51471186/article/details/117396369
话不多说现在开始。
#include<stdio.h>
#include<stdlib.h>
typedef char ElemType;//将变量进行重定义-方便一次性改变数据类型
//线索存储标志位
//Link(0):表示指向左右孩子的指针
//Thread(1):表示指向前驱后续的线索
typedef enum{Link,Thread}PointerTag;//只能在枚举的所定的范围内选取
typedef struct BiThrNode//定义树的结点
{
char data;
struct BiThrNode *lchild,*rchild;//定义结构指针作用相当于用来递归进行使用
PointerTag ltag,rtag;//只能在枚举的所定的范围内选取
}BiThrNode,*BiThrTree;//不只是指树而且还可以在对用结点进行指针对应地址标志
//全局变量,始终指向刚刚访问过的结点
BiThrTree pre;
//创建一颗二叉树,约定用户遵照前序遍历的方式输入数据
void CreateBiTree(BiThrTree *T)//创造二叉树,这个使中序遍历的,传入的参数是树的指针也可以说是数的地址
{
char c;//定义要存在树里面得到数据
scanf("%c",&c);//输入数据
if(' '==c)//判断传进去数据是否为空或则为空格
{
*T=NULL;//如果为空,则变成空指针没有后来的指向
}
else//如果输入的部位空的话就进行数据的存储和指针的指向
{
*T=(BiThrNode *)malloc(sizeof(BiThrNode));//创造出对应的树的空间
(*T)->data=c;//将数据存储进去其中T->data 这个是this指针地指向就是相当于x=x(是指后面地x是改过地)
(*T)->ltag=Link;//开始确定该地址指向可以有左右孩子
(*T)->rtag=Link;//两边都要
CreateBiTree(&(*T)->lchild);//嵌套中的嵌套,就是将下一个左右孩子的地址拿出来再次创造出新的空间
CreateBiTree(&(*T)->rchild);//如果没有或则是输入为空则停止不再输入,和创造
}
}
//中序遍历线索化
void InThreading(BiThrTree T)//开始进行中序遍历
{
if(T)//如果T存在部位null空,则就可以进行遍历
{
//先不断地往下找进行遍历,直到对应结点或树地下一个孩子也就是子叶为空时停止
InThreading(T->lchild);//递归左孩子线索化
if(!T->lchild)//就如一直遍历到最后空指针时
{
T->ltag=Thread;//在该这个树进行表值他是有数据地
T->lchild=T;//并将这个树里的嵌套地左指针指向它地本身
}
pre=T;//让最开始定义地指针指向现在这个有数据地树或则说是结点
Inthreading(T->rchild);//递归右孩子线索化//同样进行右结点地使用,因为可能它地
//右子树结点下面地左右还有子叶呢
}
}
//有序地开始遍历
void InOrderThreading(BiThrTree *p,BiThrTree T)//将最开始树,头结点和后面地树结点进行传入
{
*p=(BiThrTree)malloc(sizeof(BiThrNode));//开始开辟对应地空间的
(*p)->ltag=Link;//同样的将其是否有下面的指针指向进行确认,初始化先全为空,因为是用嵌套
(*p)->rtag=Thread;//上面的意思是只用一边
(*p)->rchild=*p;//将下面子叶指向它自己
if(!T)//加入开始定义的树它部位空
{
(*p)->lchild=T;//则让头节点剩下的另一边指向它
pre=*p;//开始引入了一直指向最新的那一边
InThreading(T);//开始进行找下面最后的所存在的数据的子叶
pre->rchild=*p;//将这个往回指
pre->rtag=Thread;//并进行表注
(*p)->rchild=pre;//并且让头节点的有不再指向它自己而是指向这个不断指向最新的点数
}
}
void visit(char c)//读取在树中存储的数据
{
printf("%c",c);//打印数据
}
//中序遍历二叉树,非递归
void InOrderTraverse(BiThrTree T)//订单开始将树中存储的信息并不断的读出来
{
BiThrTree p;//定义一个临时的点树进行暂存像temp那样当中间媒介那样
p=T->lchild;//并将其存储之前的树中的子叶
while(p!=T)//加如它存储的不是下面哪一个的上面的树依旧是最后一颗树的子叶指向它树的本身的结点就进行下面
{
while(p->ltag==Link)//先确定这一个下面是否已经为空指针了不会再向下指了
{
p=p->lchild; //如果是那就开始是将其回到上一层的树,也就是存它自己
}
visit(p->data);//并访问以一个的树里的数据
while(p->rtag==Thread&&p->rchild!=T)//当这个树的右指针还存在的话就是可以
{
p=p->rchild;//开始进行新的数据变化现在开始是找右的,一直递归,要么前面的先左道底,再右到底
visit(p->data);//因为只有一个故就到边了,就一直向下进行就行了
}
p=p->rchild;//然后同理将其进行向右的就行
}
}
int main()
{
BiThrTree P,T=NULL;//最开始就行NULL定义最初话进行
CreateBiTree(&T);//开始创造用户需要的树开始
InOrderThreading(&P,T);//将头结点和头树开始遍历查找
printf("中序遍历输出结果为:");
InOrderTraverse(p);//输入查按照的值
printf("\n");
return 0;
}
接着就是区尝试就好了。