先序线索化
#define ElemType int
#define NULL 0
ThreadNode* pre = NULL;
void CreatPreThread(ThreadTree T) {
pre = NULL;
if (T != NULL) {
PreThread(T);
if (pre->rchild == NULL)
pre->rtag == 1;
}
}
typedef struct ThreadNode {
ElemType data;
struct ThreadNode* lchild, * rchild;
int ltag, rtag;
}ThreadNode, * ThreadTree;
void PreThread(ThreadTree T) {
if (T != NULL) {
visit(T);
if(T->ltag==0)
PreThread(T->lchild);
PreThread(T->rchild);
}
}
void visit(ThreadNode* q) {
if (q->lchild == NULL) {
q->lchild = pre;
q->ltag = 1;
}
if (pre != NULL && pre->rchild == NULL) {
pre->rchild = q;
pre->rtag = 1;
}
pre = q;
}
中序线索化
#define ElemType int
#define NULL 0
ThreadNode* pre = NULL;
void CreatInThread(ThreadTree T) {
pre = NULL;
if (T != NULL) {
InThread(T);
if (pre->rchild == NULL)
pre->rtag == 1;
}
}
typedef struct ThreadNode {
ElemType data;
struct ThreadNode* lchild, * rchild;
int ltag, rtag;
}ThreadNode, * ThreadTree;
void InThread(ThreadTree T) {
if (T != NULL) {
InThread(T->lchild);
visit(T);
InThread(T->rchild);
}
}
void visit(ThreadNode* q) {
if (q->lchild == NULL) {
q->lchild = pre;
q->ltag = 1;
}
if (pre != NULL && pre->rchild == NULL) {
pre->rchild = q;
pre->rtag = 1;
}
pre = q;
}
ThreadNode* Firstnode(ThreadNode* p) {
while (p->ltag == 0) p = p->lchild;
return p;
}
ThreadNode* Nextnode(ThreadNode* p) {
if (p->rtag == 0) return Firstnode(p->rchild);
else return p->rchild;
}
void Inorder(ThreadNode* T) {
for (ThreadNode* p = Firstnode(T); p != NULL; p = Nextnode(p))
visit(p);
}
ThreadNode* Lastnode(ThreadNode* p) {
while (p->rtag == 0) p = p->rchild;
return p;
}
ThreadNode* Prenode(ThreadNode* p) {
if (p->ltag == 0) return Lastnode(p->lchild);
else return p->lchild;
}
void RevInorder(ThreadNode* T) {
for (ThreadNode* p = Lastnode(T); p != NULL; p = Prenode(p))
visit(p);
}
后序线索化
#define ElemType int
#define NULL 0
ThreadNode* pre = NULL;
void CreatPostThread(ThreadTree T) {
pre = NULL;
if (T != NULL) {
PostThread(T);
if (pre->rchild == NULL)
pre->rtag == 1;
}
}
typedef struct ThreadNode {
ElemType data;
struct ThreadNode* lchild, * rchild;
int ltag, rtag;
}ThreadNode, * ThreadTree;
void PostThread(ThreadTree T) {
if (T != NULL) {
PostThread(T->lchild);
PostThread(T->rchild);
visit(T);
}
}
void visit(ThreadNode* q) {
if (q->lchild == NULL) {
q->lchild = pre;
q->ltag = 1;
}
if (pre != NULL && pre->rchild == NULL) {
pre->rchild = q;
pre->rtag = 1;
}
pre = q;
}