#include <stdlib.h>
#include <stdio.h>
typedef struct BiThrNode {
char data;
struct BiThrNode *lchild, *rchild;
int ltag, rtag;
} BiThrNode, *BiThrTree;
BiThrNode *pre = (BiThrNode *)malloc(sizeof(BiThrNode));
void CreateBiTree(BiThrTree &T) {
char ch;
ch = getchar( );
if (ch == '@')
T = NULL;
else {
T = (BiThrNode *)malloc(sizeof(BiThrNode));
T->data = ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
void InThreading(BiThrTree p) {
if (p != NULL) {
InThreading(p->lchild);
if (!p->lchild) {
p->ltag = 1;
p->lchild = pre;
} else
p->ltag = 0;
if (!pre->rchild) {
pre->rtag = 1;
pre->rchild = p;
} else
pre->rtag = 0;
pre = p;
InThreading(p->rchild);
}
}
BiThrNode *InOrderNext(BiThrNode *p) {
BiThrNode *q;
q = p->rchild;
if (p->rtag != 1) {
while (q->ltag == 0) {
q = q->lchild;
}
}
return q;
}
void InThredTraverse(BiThrTree p) {
if (p != NULL) {
while (p->ltag == 0) {
p = p->lchild;
}
do {
printf("%2c", p->data);
p = InOrderNext(p);
} while (p != NULL) ;
}
}
int main() {
pre->rtag = 1;
pre->rchild = NULL;
BiThrTree tree;
printf("建立树,按先序遍历序列输入结点\n");
printf("空结点为@,结束按回车\n");
CreateBiTree(tree);
printf("建立中序线索二叉树\n");
InThreading(tree);
printf("线索化完毕!\n");
printf("遍历中序线索二叉树,结果为:\n");
InThredTraverse(tree);
return 0;
}