#include<iostream>
#include<stdlib.h>
using namespace std;
typedef enum{
Link,Thread} PointTag;
struct BinThreadTree
{
int data;
BinThreadTree* lchild;
BinThreadTree* rchild;
PointTag LTag;
PointTag RTag;
};
int create(BinThreadTree*(&T))
{
int num;
cin>>num;
if(num==-1)
{
T=NULL;
return 0;
}
else
{
T=(BinThreadTree*)malloc(sizeof(BinThreadTree));
T->data=num;
cout<<"请输入节点"<<num<<"的左节点的值:"<<endl;
create(T->lchild);
cout<<"请输入节点"<<num<<"的右节点的值:"<<endl;
create(T->rchild);
}
}
BinThreadTree* pre;
int InThreading(BinThreadTree* p)
{
if(p)
{
InThreading(p->lchild);
if(!p->lchild){
p->LTag=Thread;p->lchild=pre;}
else{
p->LTag=Link;}
if(!pre->rchild){
pre->RTag=Thread;pre->rchild=p;}
else{
pre->RTag=Link;}
pre=p;
InThreading(p->rchild);
}
}
int InOrderThreading(BinThreadTree* (&Thrt),BinThreadTree* T)
{
Thrt=(BinThreadTree*)malloc(sizeof(BinThreadTree));
Thrt->LTag=Link;Thrt->RTag=Thread;
Thrt->rchild=Thrt;
if(!T)Thrt->lchild=Thrt;
else
{
Thrt->lchild=T;pre=Thrt;
InThreading(T);
pre->RTag=Thread;
pre->rchild=Thrt;
Thrt->rchild=pre;
}
}
int InOrderTraverse(BinThreadTree* Thrt)
{
BinThreadTree* p=Thrt->lchild;
while(p!=Thrt)
{
while(p->LTag==Link)p=p->lchild;
cout<<p->data<<" ";
while(p->RTag==Thread&&p->rchild!=Thrt)
{
p=p->rchild;
cout<<p->data<<" ";
}
p=p->rchild;
}
cout<<endl;
}
int main()
{
BinThreadTree* T,* Thrt;
cout<<"请输入根节点的值,输入-1表示该树为空树"<<endl;
create(T);
InOrderThreading(Thrt,T);
cout<<"中序遍历的结果为:"<<endl;
InOrderTraverse(Thrt);
return 0;
}
中序线索二叉树基本操作的实现
猜你喜欢
转载自blog.csdn.net/AlberTesla/article/details/109082860
今日推荐
周排行