PBiTNode pre; //全局变量会分配一个静态空间,和NULL不是同一个
void Inthread(PBiTNode root) //初始pre取NULL
{
//对root所指的二叉树进行中序线索化,其中pre始终指向刚访问过的结点,其初值为NULL
if(root!=NULL)
{
Inthread(root->LChild); //线索化左子树
if(root->LChild==NULL) //置前驱线索
{
root->Ltag=1; root->LChild=pre;
}
else root->Ltag=0;
if(pre!=NULL&&pre->RChild==NULL) //置后继线索
{
pre->Rtag=1; root->RChild=pre;
}
else pre->Rtag=0;
pre=root; //当前访问结点为下一访问结点的前驱
Inthread(root->RChild); //线索化右子树
}
}
//中序线索树找结点后继
PBiTNode InNext(PBiTNode p)
{
PBiTNode next,q;
//p的右子树为空,由后继线索链直接得到后继结点
if(p->Rtag == 1) next=p->RChild;
else
{
//p的右子树不为空
//在p的右子树中查找“最左下端” 结点,该结点就是p的后继
for(q=p->RChild; q->Ltag == 0 ;q=q->LChild ) ; //右左右左
next=q;
}
return next;
}
//中序线索树找前驱结点
PBiTNode InPre(PBiTNode p)
{
PBiTNode pre,q;
if(p->Ltag==1) pre=p->LChild;
else
{
//在p的左子树中查找“最右下端” 结点,该结点就是p的后继
for(q=p->LChild;q->Rtag==0;q=q->RChild) //左右左右
pre=q;
}
return pre;
}
//在中序线索树上求中序遍历的第一个结点
//最左结点就是第一个
PBiTNode InFirst(PBiTNode Bt)
{
PBiTNode p=Bt;
if(!p) return NULL;
while(p->Ltag == 0) p=p->LChild;
return p;
}
//遍历中序二叉树
void TInOrder(PBiTNode Bt)
{
PBiTNode p;
p=InFirst(Bt);
while(p)
{
//visit(p); //读取想要的值
p=InNext(p);
}
}