
#include <stdio.h>
#include <stdlib.h>
#define ElemType int
typedef struct ThreadNode{
ElemType data;
struct ThreadNode *lchild, *rchild;
int ltag, rtag;
} ThreadNode, *ThreadTree;
ThreadNode *preNode = NULL;
void visit(ThreadNode *nowNode)
{
if(NULL == nowNode->lchild){
nowNode->lchild = preNode;
nowNode->ltag = 1;
}
if(NULL != preNode && NULL == preNode->rchild){
preNode->rchild = nowNode;
preNode->rtag = 1;
}
preNode = nowNode;
}
void InitThreadTree(ThreadTree &T)
{
T == NULL;
}
void InThread(ThreadTree T)
{
if(NULL != T){
InThread(T->lchild);
visit(T);
InThread(T->rchild);
}
}
ThreadNode* CreateNode(int data)
{
struct ThreadNode *node = (ThreadNode *)malloc(sizeof(ThreadNode));
node->ltag = 0;
node->rtag = 0;
node->lchild = NULL;
node->rchild = NULL;
node->data = data;
return node;
}
void CreateBiTree(ThreadTree &T)
{
T = CreateNode(1);
T->lchild = CreateNode(2);
T->rchild = CreateNode(3);
T->lchild->lchild = CreateNode(4);
T->lchild->rchild = CreateNode(8);
T->rchild->lchild = CreateNode(5);
T->rchild->rchild = CreateNode(6);
}
void CreateInThread(ThreadTree T)
{
preNode = NULL;
if(NULL != T){
InThread(T);
if(NULL == preNode->rchild){
preNode->rtag = 1;
}
}
}
ThreadNode* FirstNode(ThreadNode *p)
{
while(0 == p->ltag){
p = p->lchild;
}
return p;
}
ThreadNode *NextNode(ThreadNode *p)
{
if(0 == p->rtag){
return FirstNode(p->rchild);
}
else{
return p->rchild;
}
}
ThreadNode* LastNode(ThreadNode *p)
{
while(0 == p->rtag){
p = p->rchild;
}
return p;
}
ThreadNode* PreNode(ThreadNode *p)
{
if(p->ltag == 0){
return LastNode(p->lchild);
}
else{
return p->lchild;
}
}
void PrintNode(ThreadNode *node)
{
if(NULL == node->lchild){
printf("结点前驱:NULL ");
}
else{
if(node->ltag == 1)
printf("结点前驱:%d ", node->lchild->data);
else{
ThreadNode *p1;
p1 = PreNode(node);
printf("结点前驱: %d ", p1->data);
}
}
printf("访问结点:%d ", node->data);
if(NULL == node->rchild){
printf("结点后继:NULL\n");
}
else{
if(node->rtag == 1)
printf("结点后继:%d\n", node->rchild->data);
else{
ThreadNode *p;
p = NextNode(node);
printf("结点后继: %d\n", p->data);
}
}
}
void InOrder(ThreadNode *T)
{
for(ThreadNode *p = FirstNode(T); p != NULL; p = NextNode(p)){
PrintNode(p);
}
}
void RevInOrder(ThreadNode *T)
{
for(ThreadNode *p = LastNode(T); p != NULL; p = PreNode(p)){
PrintNode(p);
}
}
int main()
{
ThreadTree T;
InitThreadTree(T);
CreateBiTree(T);
CreateInThread(T);
InOrder(T);
printf("\n");
printf("反转逆序输出\n");
RevInOrder(T);
return 0;
}