#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef enum {Link,Thread} PointerTag; //枚举类型;
typedef struct BiThrNode //创建结点;
{
char data;
struct BiThrNode *lchild,*rchild;
PointerTag LTag,RTag;
}BiThrNode,*BiThTree;
BiThTree pre;
BiThTree CreatBiTree();
void InOrderThr(BiThTree *head,BiThTree T);
void InThreading(BiThTree p);
void InOrderTraverse(BiThTree T);
int main()
{
BiThTree BT;
BT=CreatBiTree();
BiThTree head;
InOrderThr(&head,BT);
InOrderTraverse(head);
return 0;
}
BiThTree CreatBiTree()
{
BiThTree T;
char ch;
ch=getchar();
if(ch==’#’)
{
T=NULL;
}
else
{
T=(BiThTree)malloc(sizeof(BiThrNode));
T->data=ch;
T->LTag=Link;
T->RTag=Link;
T->lchild=CreatBiTree();
T->rchild=CreatBiTree();
}
return T;
}
//-----------------------------------------------------------
void InOrderThr(BiThTree *head,BiThTree T) //二叉树的线索化(中序线索二叉树)
{ //在遍历过程中,如果发现某个结点的左/右指针域为空,则将它们
(*head)=(BiThTree)malloc(sizeof(BiThrNode)); //改为指向前驱/后继结点的线索;
pre=*head;
(*head)->rchild=*head;
if(T==NULL) //若二叉树为空,只有一个头结点,lchild与rchild均指向本身;
{
(*head)->lchild=*head;
}
else
{
pre=*head;
(*head)->lchild=T;
InThreading(T);
pre->rchild=*head; //(1)表示最后一个结点;
pre->RTag=Thread; //(2)
(*head)->rchild=pre; //(3)
}
}
void InThreading(BiThTree p)
{
if(p!=NULL)
{
InThreading(p->lchild);
if(p->lchildNULL) //无左孩子且是中序序列的第一个结点,即前驱为空;
{
p->LTag=Thread;
p->lchild=pre;
}
if(pre->rchildNULL) //无右孩子且是中序序列的最后一个结点,即后继为空;
{
pre->RTag=Thread;
pre->rchild=p;
}
pre=p;
InThreading(p->rchild);
}
}
//---------------------------------------------------
void InOrderTraverse(BiThTree T) //遍历函数;
{
BiThTree p=T->lchild;
while(T!=p)
{
while(p->LTagLink)
{
p=p->lchild;
}
printf("%c ",p->data);
while(p->RTagThread&&p->rchild!=T)
{
p=p->rchild;
printf("%c ",p->data);
}
p=p->rchild;
}
}
输入:ABH##FD###E#CK##G##
输出:H B D F A E K C G