InThreading()、InOrderThreading()、InOrderTraverse_Thr()等几个函数来自于严蔚敏老师的数据结构教材,本人编写了main()函数,在VC++6.0和DEV-C++下编译通过。
输入:ABC空格空格D空格空格E空格空格
输出:C B D A E
#include "stdio.h"
#include "malloc.h"
typedef struct BiThrNode
{
char data;
struct BiThrNode *lchild, *rchild; // 左右指针
int LTag, RTag; //左右标志: 0代表孩子, 1代表线索
}BiThrNode, *BiThrTree;
BiThrTree pre;
void CreateBiTree(BiThrTree &T)
{
char ch;
scanf("%c",&ch);
if(ch==' ')
T=NULL;
else
{
T = (BiThrNode *)malloc(sizeof(BiThrNode));
T->data = ch; // 生成根结点
T->LTag=0;
T->RTag=0;
CreateBiTree(T->lchild); // 构造左子树
CreateBiTree(T->rchild); // 构造右子树
}
}
void InThreading(BiThrTree p)
{
if(p)
{ // 对以p为根的非空二叉树进行线索化
InThreading(p->lchild); // 左子树线索化
if(!p->lchild) // 建前驱线索
{
p->LTag = 1;
p->lchild = pre;
}
if(!pre->rchild) // 建后继线索
{
pre->RTag = 1;
pre->rchild = p;
}
pre = p; // 保持 pre 指向 p 的前驱
InThreading(p->rchild); // 右子树线索化
}
}
int InOrderThreading(BiThrTree &Thrt, BiThrTree T)
{ // 构建中序线索链表
Thrt = (BiThrTree)malloc(sizeof( BiThrNode));
Thrt->LTag = 0;
Thrt->RTag =1;
Thrt->rchild = Thrt; // 添加头结点
if(!T)
Thrt->lchild = Thrt;
else
{
Thrt->lchild = T;
pre = Thrt;
InThreading(T);
pre->rchild = Thrt; // 处理最后一个结点
pre->RTag = 1;
Thrt->rchild = pre;
}
return 1;
}
void InOrderTraverse_Thr(BiThrTree T)
{
BiThrTree p;
p = T->lchild; // p指向根结点
while(p != T)
{ // 空树或遍历结束时,p==T
while(p->LTag==0)
p=p->lchild; // 第一个结点
printf("%c ",p->data);
while(p->RTag==1 && p->rchild!=T)
{
p = p->rchild;
printf("%c ",p->data); // 访问后继结点
}
p=p->rchild; // p进至其右子树根
}
} // InOrderTraverse_Thr
int main()
{
BiThrTree T,Thrt;
CreateBiTree(T);
InOrderThreading(Thrt, T);
InOrderTraverse_Thr(Thrt);
printf("\n");
return 0;
}