线索二叉树改写
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/*1、线索二叉树的创建和遍历操作算法的实现
编程实现二叉树的线索链表存储表示的基本操作,这些基本操作包括:线索二叉树的创建、线索二叉树的中序遍历算法的实现。要求对程序中的一些关键语句要有注释,并能够进行简单
的输入输出验证。*/
#include
#include
typedef int Status;
typedef char TElemType;
typedef enum PointerTag {Link,Thread};
typedef struct BiThrNode{
TElemType data;
struct BiThrNode *lchild,*rchild;
PointerTag LTag,RTag;
}BiThrNode,*BiThrTree;
void CreateBiTree(BiThrTree &T){
char ch;
scanf("%c",&ch);
if(ch=='#') T=NULL;
else{
T=(BiThrTree)malloc(sizeof(BiThrNode));
T->data=ch;
T->LTag=Link;
T->RTag=Link;
// printf("%c;L",ch);
CreateBiTree(T->lchild);
// printf("%c;R",ch);
CreateBiTree(T->rchild);
// printf("%c;O",ch);
}
}
BiThrTree pre;
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 &Thrt,BiThrTree T) {
Thrt=(BiThrTree)malloc(sizeof(BiThrNode));
if(!Thrt) return ;
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;
}
}
void Visit(TElemType e)
{
printf("%c",e);
}
void InOrderTraverse(BiThrTree T){
BiThrTree p;
p=T->lchild;
while(p!=T){
while(p->LTag==Link)
p=p->lchild;
Visit(p->data);
while(p->RTag==Thread&&p->rchild!=T){
p=p->rchild;
Visit(p->data);
}
p=p->rchild;
}
}
int main()
{
BiThrTree T,L;
CreateBiTree(T); InOrderThreading(L,T); InOrderTraverse(L); return 0;
}