1)中序线索二叉树
-
查找p的前驱:查左线索;若无左线索,结点的前驱是遍历左子树时访问的最后一个结点。
-
查找p的后继:查右线索;若无右线索,结点的后继是遍历右子树时访问的第一个结点。
2)先序线索二叉树
-
查找p的前驱:查左线索;若无左线索,结点的前驱是结点的双亲结点,或是先序遍历其双亲结点左子树时最后访问的结点。
-
查找p的后继:查右线索;若无右线索,结点的后继必为结点的左子树(若存在)或右子树根结点。
3)后序线索二叉树
-
查找p的前驱:查左线索;若无左线索,且无右线索时,结点的前驱是右子树根结点;若无左线索,但是有右线索时,结点的前驱是左子树根结点。
-
查找p的后继,这种查找比较复杂,分4类情况讨论:
若p为二叉树的根结点,后继为空;
若p为右子树根结点,后继为双亲结点;
若p为左子树根结点,且无右兄弟,后继为双亲结点;
若p为左子树根结点,且有右兄弟,后继为后序遍历双亲结点右子树时访问的第一个结点。
由上述情况可知,在先序线索二叉树上找前驱和在后序线索二叉树上找后继都比较复杂。
(1)找结点的中序前驱结点
BiTNode *InPre (BiTNode *p)
/*在中序线索二叉树中查找p的中序前驱结点,并用pre指针返回结果*/
{if (p->Ltag==1) pre = p->LChild; /*直接利用线索*/
else
{I在p的左子树中查找“最右下端”结点*1
for ( q=p->LChild; q>Rtag= =0; q=q->RChild);
pre = q;
}
return (pre);
}
(2)找结点的中序后继结点
BiTNode *InSucc (BiTNode *p)
/*在中序线索二叉树中查找p的中序后继结点,并用succ指针返回结果*1
{if (p->Rtag= =1) succ = p->RChild; 1/*直接利用线索*/
else
{I"在p的右子树中3找“最左下端”结点*/
for ( q=p->RChild; q->Ltag= =0; q=q->LChild);
succ= q;
}
return(succ);
}
(3)结点*p在先序序列中的后继
TBTNode *preSucc(TBTNode *p)
{
if(p->ltag == 0)
succ = p->lchild;
else succ = p->rchild;
return (succ)
}//结点*p在先序序列中的后继
(4)结点*p在后序序列中的前驱
TBTNode *succPre(TBTNode *p)
{
if(p->ltag == 0)
Pre = p->rchild;
else Pre = p->lchild;
return (Pre)
}//结点*p在后序序列中的前驱