此处以遍历中序线索为例,代码如下:
#include<bits/stdc++.h>
using namespace std;
typedef struct BiThrNode{
char data;
int ltag,rtag;
struct BiThrNode *lchild,*rchild;
}BiThrNode,*BiThrTree;
BiThrNode *pre = NULL;
void createBiTree(BiThrTree &t){
char c;
cin>>c;
if(c=='#')
t = NULL;
else{
t = new BiThrNode;
t->data = c;
createBiTree(t->lchild);
createBiTree(t->rchild);
}
}
void InThreading(BiThrTree p){
if(p){
InThreading(p->lchild);
if(!p->lchild){
p->ltag = 1;
p->lchild = pre;
}
else
p->ltag = 0;
if(!pre->rchild){
pre->rtag = 1;
pre->rchild = p;
}
else
pre->rtag = 0;
pre = p;
InThreading(p->rchild);
}
}
void InOrderThreading(BiThrTree &thrt,BiThrTree t){
thrt = new BiThrNode;
thrt->ltag = 0;
thrt->rtag = 1;
thrt->rchild = thrt;
if(!t)
thrt->lchild = thrt;
else{
thrt->lchild = t;
pre = thrt;
InThreading(t);
pre->rchild = thrt;
pre->rtag = 1;
thrt->rchild = pre;
}
}
void InOrderTraverse_Thr(BiThrTree t){
BiThrNode *p = t->lchild;
while(p!=t){
while(p->ltag == 0)
p = p->lchild;
cout<<p->data;
while(p->rtag == 1&&p->rchild != t){
p = p->rchild;
cout<<p->data;
}
p = p->rchild;
}
}
int main(){
BiThrNode *p,*thrt;
createBiTree(p);
InOrderThreading(thrt,p);
InOrderTraverse_Thr(p);
return 0;
}