线索二叉树

#include <iostream.h>
#include <malloc.h>
typedef enum PointerTag {Link,Thread};
typedef int TelemType;
typedef struct BiThrNode
{
TelemType data;
struct BiThrNode *lchild,*rchild;
PointerTag LTag,RTag;
}BiThrNode,*BiThrTree;
bool InitBiThrTree(BiThrTree &T)
{
TelemType s;
cout<<"请输入数据:"<<endl;
cin>>s;
if(s==0) T=NULL;
else
{
if(!(T=(BiThrNode *)malloc(sizeof(BiThrNode)))) return 0;
T->data=s;
T->LTag=Link;
T->RTag=Link;
InitBiThrTree(T->lchild);
InitBiThrTree(T->rchild);
}
return 1;
}
bool InOderTrave(BiThrTree T)
{
if(T== NULL) return 0;
else
{
InOderTrave(T->lchild);
cout<<T->data<<"  ";
InOderTrave(T->rchild);
}
return 1;
}
void InThreading(BiThrTree p)
{
BiThrTree pre;
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);
}
}
bool InOrderThreading(BiThrTree &Thrt,BiThrTree T)
{
BiThrTree pre;
if(!(Thrt=(BiThrTree)malloc(sizeof(BiThrNode)))) return 0;
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;
}
return 1;
}
bool InOrderTraverse_Thr(BiThrTree T)
{
BiThrTree p;
p=T->lchild;
while(p!=T)
{
while(p->LTag==Link) p=p->lchild;
cout<<p->data<<"  ";
while(p->RTag==Thread && p->rchild!=T)
{
p=p->rchild;
cout<<p->data<<"  ";
}
p=p->rchild;
}
return 1;
}
int main()
{
BiThrTree T,Thrt;
InitBiThrTree(T);
cout<<"对二叉树进行中序遍历得到:";
InOderTrave(T);
cout<<endl;
cout<<"对二叉树进行中序线索化。"<<endl;
InOrderThreading(Thrt,T);
cout<<"对二叉树进行中序线索化遍历为:"<<endl;
InOrderTraverse_Thr(Thrt);
cout<<endl;
return 0;

}

算是搞完了吧,这个和二叉树没有什么太大的区别,但是应用方面可能比二叉树要强悍,但是目前我还没用到。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值