#include<stdio.h>
#define MAX 100
typedef struct BTNode {
int e;
struct BTNode *rchild, *lchild;
int ltag, rtag;
}BTNode;
void inThread(BTNode *, BTNode **);
void createInThread(BTNode *);
BTNode * getFirst(BTNode *);
BTNode * getLast(BTNode *);
BTNode * getPrecursor(BTNode *);
BTNode * getSucceeding(BTNode *);
void traverseInThread(BTNode *);
int main(void) {
system("COLOR fc");
putchar('\n');
system("pause");
return 0;
}
void inThread(BTNode *p, BTNode **pre) {
if (NULL != p) {
inThread(p->lchild, pre);
if (NULL == p->lchild) {
p->lchild = *pre;
p->ltag = 1;
}
if (NULL != *pre && NULL == (*pre)->rchild) {
(*pre)->rchild = p;
(*pre)->rtag = 1;
}
*pre = p;
inThread(p->lchild, pre);
}
}
void createInThread(BTNode *p) {
if ( NULL != p) {
BTNode *pre = NULL;
inThread(p, &pre);
pre->rtag = 1;
pre->rchild = NULL;
}
}
BTNode* getFirst(BTNode *p) {
if (NULL != p) {
while (0 == p->ltag)
p = p->lchild;
return p->lchild;
}
else return NULL;
}
BTNode* getLast(BTNode *p) {
if (NULL != p) {
while (0 == p->rtag)
p = p->rchild;
return p->rchild;
}
else return NULL;
}
BTNode* getPrecursor(BTNode *p) {
if (NULL != p) {
if (1 == p->ltag)
return p->lchild;
else return getLast(p->lchild);
}
else return NULL;
}
BTNode* getSucceeding(BTNode *p) {
if (NULL != p) {
if (1 == p->rtag)
return p->rchild;
else return getFirst(p->rchild);
}
else return NULL;
}
void traverseInThread(BTNode *p){
for (p = getFirst(p); p = getSucceeding(p); NULL != p)
printf("%5d ", p->e);
}