#include<stdio.h>
#include<stdlib.h>
typedef enum { link, thread } PointerTag;
//创建树的一个节点
typedef struct BiNode {
char data;
struct BiNode *lchild;
struct BiNode *rchild;
PointerTag ltag;
PointerTag rtag;
}BitrNode, *BiTree;
//创建一个全局变量,始终指向刚刚访问的结点
BiTree pre; //这里可以看出 这是一个指针
//创建一棵树 运用前序遍历创建 要注意区分一级指针和二级指针
CreateThree(BiTree *T) {
char c;
scanf("%c", &c);
if (' ' == c) {
(*T) = NULL;
}
else {
*T = (BitrNode *)malloc(sizeof(BitrNode));
(*T)->data = c;
(*T)->ltag = link; //这里先假设是成立的
(*T)->rtag = link;
CreateThree(&(*T)->lchild); // 这里函数的接口是个二层指针。因此这里应该是一个地址
CreateThree(&(*T)->rchild);
}
}
//进行中序遍历,线索化(修改ltag和指向对象)
Inthreading(BiTree T) {
if (T != NULL) {
Inthreading((T)->lchild); //递归,一直递归到最左的叶子
if ((T)->lchild == NULL) {
(T)->ltag = thread;
(T)->lchild = pre;
}
if (pre->rchild == NULL) {
pre->ltag = thread;
pre->rchild = T;
}
pre = T; //这一句有待考证
Inthreading((T)->rchild); //递归,一直递归到最右的叶子
}
}
InOrderThreading(BiTree p, BiTree T) {
p = (BiTree)malloc(sizeof(BitrNode));
p->ltag = link;
p->rtag = thread;
p->rchild = p; // 不懂啊
if (!T)
{
p->lchild = p;
}
else {
p->lchild = T;
pre = p;
Inthreading(T);
pre->rchild = p;
pre->rtag = thread;
p->rchild = pre;
}
}
int main()
{
BiTree T;
CreateThree(&T);
InOrderThreading(pre, T);
}