线索二叉树根据其线索周游很方便
中序周游
void nInOrder(ThrTree t){
ThrTree p=t;
if(t==NULL)
return ;
while(p->llink!=NULL&&p->ltag==0) p = p->llink; //左节点不为空,顺左节点一直向下
while(p!=NULL){
visit(*p); //周游
if(p->rlink!=NULL&&p->rtag==0){ //右节点不是线索 此时其左子树是空
p=p->rlink; //指向右节点
while(p->llink!=NULL && p->ltag==0) p = p->llink; //右子树的左节点不为线索 ,顺着右节点的左子树一直向下
}
else p = p->rlink; //是线索就顺着线索向下
}
}
前序周游
void ThreadPreOrder(PBinTree t)
{
ThrTree p=t;
if(t == NULL)
return ;
else visit(*p);
while(p != NULL)
{
if( p->llink!=NULL && p->ltag==0 ){ // 又左节点就一直访问,直到左节点为空,此时p指向左节点的上面。
p=p->llink;visit(*p);
}
else if( p->rlink!=NULL && p->rtag==0 ){ //如果没有左节点,那么访问右节点,直到其右节点也为空。
p=p->rlink;visit(*p);
}
else if( p->rlink->rlink!=NULL){ //因为上面的条件均不成立,因此p-rlink一定是指向中序遍历的后继节点,访问!
p=p->rlink->rlink;visit(*p);
}
else break;//条件都不成立,退出大循环。
}
}
如何求前序的后继呢?
对上述程序做修改即可
如何求后序的前驱呢?
BiThrTree InPostPre (BiThrTree p)
//在中序线索二叉树t中,求指定结点p在后序下的前驱结点q
{
BiThrTree q;
if (p->rtag==0)
q=p->rchild; //若p有右子女,则右子女是其后序前驱
else if (p->ltag==0)
q=p->lchild; //若p无右子女而有左子女,左子女是其后序前驱。
else if(p->lchild==null) 、
q=null;//p是中序序列第一结点,无后序前驱
else //顺左线索向上找p的祖先,若存在,再找祖先的左子女
{
while(p->ltag==1 && p->lchild!=null)
p=p->lchild;
if(p->ltag==0)
q=p->lchild; //p结点的祖先的左子女是其后序前驱
else
q=null; //仅右单枝树(p是叶子),已上到根结点,p结点无后序前驱
}
return(q);
}//结束InPostPre