实现需要注意的地方:
1、对指针的操作不太熟悉的朋友,可以使用c++提供的引用方式实现,int i;int *p;int **pi;p=&i;pi=&p; **pi、*pi、*p的操作(修改)分别是对那些变量有影响?你能回答么?
2、知道为什么要定义BiThrNode和*BiThrTree类型么?
3、如果还有疑问欢迎一起探讨。
#include <stdio.h>
#include <stdlib.h>
typedef enum {link,thread} PointerTag;
typedef char TElemType;
typedef struct BiThrNode
{
TElemType data;
struct BiThrNode *lchild,*rchild;
PointerTag lTag,rTag;
}BiThrNode,*BiThrTree;
BiThrTree pre;
void createBiThrTree(BiThrTree * T)//也可以使用引用类型(BiThrTree &T),但代码就不一样了,*T改为T就可以了
{
TElemType cData;
scanf("%c",&cData);
if (' '==cData)
{
*T=NULL;
}
else
{
*T=(BiThrTree)malloc(sizeof(BiThrNode));
(*T)->data=cData;
(*T)->lTag=link;
(*T)->rTag=link;
createBiThrTree(&((*T)->lchild));
createBiThrTree(&((*T)->rchild));
}
}
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);
}
}
void InOrderThreading(BiThrTree *p,BiThrTree T)
{
*p=(BiThrTree)malloc(sizeof(BiThrNode));
(*p)->lTag=link;
(*p)->rTag=thread;
(*p)->rchild=*p;
if (!T)
{
(*p)->lchild=*p;
}
else
{
(*p)->lchild=T;
pre=*p;
InThreading(T);
//收尾工作,对最后一个节点线索
pre->rTag=thread;
pre->rchild=*p;
(*p)->rchild=pre;
}
}
void InOrderTravse_Thr(BiThrTree T)
{
printf("用迭代法访问线索二叉树:\n");
BiThrTree 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;
}
}
int main()
{
BiThrTree p,T=NULL;
createBiThrTree(&T);
InOrderThreading(&p,T);
InOrderTravse_Thr(p);
printf("\n");
return 0;
}