C语言实现二叉树的线索化以及如何遍历线索二叉树!
线索二叉树的结构及数据类型定义
//定义数据类型
typedef char ElemType;
//枚举,Link为0表示不是线索,Thread为1表示为线索
typedef enum {
Link,
Thread
} PointerTag;
//结点结构构造
typedef struct BiThrNode {
ElemType data;//数据域
struct BiThrNode *lchild, *rchild;//左右孩子指针域
PointerTag Ltag, Rtag;//标志域,枚举类型
} BiThrNode, *BiThrTree;
BiThrTree pre = NULL;
根据输入结点初始化二叉树
//根据输入结点初始化并建立二叉树
bool CreateBiThrTree(BiThrTree &T) {
//输入二叉树中的结点的值(一个字符),空格字符表示空树并构造二叉链表表示的树T
ElemType ch;
scanf("%c", &ch);
getchar();
if (ch == ' ') {
T = NULL;
} else {
if (!(T = (BiThrTree) malloc(sizeof(BiThrNode)))) {
return false;
}
T->data = ch; //生成根结点
printf("请输入%c的左子树:", ch);
CreateBiThrTree(T->lchild); //构造左子树
printf("请输入%c的右子树:", ch);
CreateBiThrTree(T->rchild); //构造右子树
}
return true;
}
中序遍历二叉树并线索化
//中序遍历并线索化
void InOrderThreading(BiThrTree T) {
//如果当前结点没有左孩子,左标志位设为1,左指针域指向上一结点 pre
if (!T->lchild) {
T->Ltag = Thread;
T->lchild = pre;
}
//如果 pre 没有右孩子,右标志位设为 1,右指针域指向当前结点。
if (pre && !pre->rchild) {
pre->Rtag = Thread;
pre->rchild = T;
}
//pre指向当前结点
pre = T;
}
//中序遍历二叉树并进行线索化
void InOrder(BiThrTree T) {
//如果当前结点存在
if (T) {
InOrder(T->lchild);//递归当前结点的左子树,进行线索化
Visit(T);
InOrderThreading(T);
InOrder(T->rchild);//递归右子树进行线索化
}
}
遍历中序线索二叉树
//中序遍历线索二叉树
void InOrderThraverse_Thr(BiThrTree T) {
while (T) {

本文介绍使用C语言实现二叉树的线索化过程,包括数据类型定义、二叉树初始化、中序遍历及线索化算法。通过具体代码示例,详细解释了如何遍历线索二叉树,并提供了项目完整代码及运行效果展示。
最低0.47元/天 解锁文章
1421

被折叠的 条评论
为什么被折叠?



