编译环境:VC++6.0
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#define ERROR 0
#define OK 1
typedef char ElemType;
typedef enum PointerTag{Link,Thread}; /* Link==0: 指针 Thread==1: 线索 */
/* 二叉树结构体 */
typedef struct _ThrBiTreeNode /* 线索二叉树结构体 */
{
ElemType data;
struct _ThrBiTreeNode *lchild,*rchild;
PointerTag LTag,RTag;
}ThrBiTree;
int CreateThrBiTree(ThrBiTree **T) /* 建立二叉树 */
{
char ch;
scanf("%c",&ch);
getchar();
if(ch == '#')
*T = NULL;
else
{
assert((*T) = (ThrBiTree*)malloc(sizeof(ThrBiTree)));
(*T)->data = ch;
(*T)->LTag = Link;
(*T)->RTag = Link;
(*T)->lchild = NULL;
(*T)->rchild = NULL;
CreateThrBiTree(&(*T)->lchild);
CreateThrBiTree(&(*T)->rchild);
}
return OK;
}
int Threading(ThrBiTree **pre, ThrBiTree *p) /* 线索化操作 */
{
if(p)
{
Threading(pre,p->lchild);
if(!p->lchild) /* 指向前驱 */
{
p->LTag = Thread;
p->lchild = *pre;
}
if(!(*pre)->rchild) /* 指向后继 */
{
(*pre)->RTag = Thread;
(*pre)->rchild = p;
}
*pre = p;
Threading(pre,p->rchild);
}
return OK;
}
int inorder_thread(ThrBiTree **Thrt,ThrBiTree *p)
{
ThrBiTree *pre;
assert(*Thrt = (ThrBiTree*)malloc(sizeof(ThrBiTree)));
(*Thrt)->LTag = Link;
(*Thrt)->RTag = Thread;
(*Thrt)->rchild = *Thrt; /* 右指针回指头结点 */
if(!p)
{
(*Thrt)->lchild = *Thrt; /*如果二叉树为空,则做指针回指头结点*/
}
else
{
pre = *Thrt;
(*Thrt)->lchild = p; /* 指向树的第一个结点 */
Threading(&pre,p); /* 线索化 */
/* 处理最后一个结点 */
pre->RTag = Thread;
pre->rchild = *Thrt;
(*Thrt)->rchild = pre;
}
return OK;
}
int print_ThrBiTree(ThrBiTree *T) /* 中序打印线索二叉树 */
{
ThrBiTree *p;
p = T->lchild;
while(p != T)
{
while(p->LTag == Link)
{
p = p->lchild;
}
printf("%c",p->data);
while(p->RTag == Thread && p->rchild != T)
{
p = p->rchild;
printf("%c",p->data);
}
p = p->rchild;
}
return OK;
}
void main(void)
{
ThrBiTree *T,*Thrt;
CreateThrBiTree(&T);
inorder_thread(&Thrt,T);
print_ThrBiTree(Thrt);
}