二叉线索树的结构定义
typedef enum{Link, Thread}PointerTag;
typedef struct ThreadNode
{
char data;
ThreadNode *lchild, *rchild;
PointerTag ltag, rtag;
}ThreadNode, *ThreadTree;
创建一棵二叉树
void CreateBiTree(ThreadTree &T)
{
char c;
cin >> c;
if(c=='*')T=NULL;
else
{
T=(ThreadTree)malloc(sizeof(ThreadNode));
T->data=c;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
创建一棵二叉树及二叉树基本操作
void CreateBiTree(ThreadTree &T)
{
char c;
cin >> c;
if(c=='*')T=NULL;
else
{
T=(ThreadTree)malloc(sizeof(ThreadNode));
T->data=c;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
void visit(ThreadTree T)
{
if(T)
{
cout << T->data << "(" << T->ltag << "," << T->rtag << ")" << " ";
}
}
void PreOrderTraveral(ThreadTree T)
{
if(T)
{
visit(T);
PreOrderTraveral(T->lchild);
PreOrderTraveral(T->rchild);
}
}
void InOrderTraverse(ThreadTree T)
{
if(T)
{
InOrderTraverse(T->lchild);
visit(T);
InOrderTraverse(T->rchild);
}
}
void PostOrderTraverse(ThreadTree T)
{
if(T)
{
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
visit(T);
}
}
中序遍历二叉树线索化的递归算法
void InThread(ThreadTree &p, ThreadTree &pre)
{
if(p!=NULL)
{
InThread(p->lchild, pre);
if(p->lchild==NULL)
{
p->lchild=pre;
p->ltag=Thread;
}
if(pre!=NULL&&pre->rchild==NULL)
{
pre->rchild=p;
pre->rtag=Thread;
}
pre=p;
InThread(p->rchild, pre);
}
}
通过中序遍历建立中序线索二叉树
void CreateInThread(ThreadTree T)
{
ThreadTree pre=NULL;
if(T!=NULL)
{
InThread(T, pre);
pre->rchild=NULL;
pre->rtag=Thread;
}
}
中序遍历
ThreadNode *Firstnode(ThreadNode *p)
{
while(p->ltag!=Thread)
{
p=p->lchild;
}
return p;
}
ThreadNode *Nextnode(ThreadNode *p)
{
if(p->rtag!=Thread)
{
return Firstnode(p->rchild);
}
else
{
return p->rchild;
}
}
void InOrder(ThreadNode *T)
{
for(ThreadNode *p=Firstnode(T); p!=NULL; p=Nextnode(p))
{
visit(p);
}
}
主函数
int main()
{
ThreadTree T=NULL;
CreateBiTree(T);
InOrderTraverse(T);
cout << endl;
CreateInThread(T);
InOrder(T);
return 0;
}
测试