根据严蔚敏教材第135页算法6.6和6.7而来,可在VC下运行。
#include <stdio.h>
#include <process.h>
#include <stdarg.h>
#include <stdlib.h>
#include <malloc.h>

#define NULL 0
#define MAXNODE 100
#define OVERFLOW -2
#define OK 1
#define TRUE 1
#define FALSE 0
#define ERROR -1
//#define Link 0
//#define Thread 1

typedef char TElemType;
typedef int Status;
typedef enum PointerTag {Link,Thread};//Link==0;指针,Thread==1;线索
typedef struct BiThrNode
{
TElemType data;
struct BiThrNode *lchild,*rchild;
PointerTag LTag,RTag;
} BiThrNode,*BiThrTree;

BiThrTree Pre;//全局变量

Status PrintElement(TElemType e)
{
printf("_%c_",e);return OK;
}//PrintElement

Status NewTree(BiThrTree &T)
{
T=(BiThrNode *)malloc(sizeof(BiThrNode));
T->data='#';
T->LTag=Link;T->RTag=Link;
T->lchild=NULL;T->rchild=NULL;
return OK;
}//NewTree

Status CreateBiTree(BiThrTree &T)
{
TElemType ch;
scanf("%c",&ch);
if(ch=='#') T=NULL;
else
{
if(!(T=(BiThrNode *)malloc(sizeof(BiThrNode))))
return OVERFLOW;
T->data=ch;
T->LTag=Link;T->RTag=Link;
printf("Create BiThrNode succeed at %c ",T->data);
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
return OK;
}//CreateBiThrTree

void InThreading(BiThrTree p)
{
if(p)
{
InThreading(p->lchild);
if(!(p->lchild))
{
p->LTag=Thread;p->lchild=Pre;
}
if(!(Pre->rchild))
{
Pre->RTag=Thread;Pre->rchild=p;
}
Pre=p;
InThreading(p->rchild);
}
}//InThreading

Status InOrderTraverseThreading(BiThrTree &Thrt,BiThrTree T)
{
if(!(Thrt=(BiThrNode *)malloc(sizeof(BiThrNode))))
return OVERFLOW;
Thrt->LTag=Link;Thrt->RTag=Thread;
Thrt->rchild=Thrt;
if(!T)
Thrt->lchild=Thrt;
else
{
Thrt->lchild=T;Pre=Thrt;
InThreading(T);
Pre->rchild=Thrt;Pre->RTag=Thread;
Thrt->rchild=Pre;
}
return OK;
}//InOrderTraverseThreading

Status InOrderTraverse(BiThrTree T,Status(*Visit)(TElemType e))
{
BiThrTree p;
p=T->lchild;
while(p!=T)
{
while(p->LTag==Link) p=p->lchild;
if(!Visit(p->data)) return ERROR;
while((p->RTag==Thread)&&(p->rchild!=T))
{
p=p->rchild;Visit(p->data);
}
p=p->rchild;
}
return OK;
}//InOrderTraverse

int main()
{
BiThrTree S,T;
NewTree(T);
CreateBiTree(T);printf("CreateBiTree Complete ");
// InOrderTraverse(T,PrintElement);
InOrderTraverseThreading(S,T);
InOrderTraverse(S,PrintElement);
return 1;
}
/*运行结果:输入
-+a##*b##-c##d##/e##f##
Create BiThrNode succeed at -
Create BiThrNode succeed at +
Create BiThrNode succeed at a
Create BiThrNode succeed at *
Create BiThrNode succeed at b
Create BiThrNode succeed at -
Create BiThrNode succeed at c
Create BiThrNode succeed at d
Create BiThrNode succeed at /
Create BiThrNode succeed at e
Create BiThrNode succeed at f
CreateBiTree Complete
_a__+__b__*__c__-__d__-__e__/__f_Press any key to continue*/