寻找前驱:
由二叉线索树的性质可得,当其Ltag=1时表示其lchild中保存的是前驱,否则保存的是link
所以对于结点P,当p->ltag=1,则p->lchild直接表示的是前驱,否则说明他有左子树,按照中序遍历的规则,只有当左子树遍历完才遍历它,因此其前驱应该是左子树的最右下端结点。
BiTNode * Inpre(BiTNode *p)
{
//在中序遍历中寻找前驱并用pre返回
if(p->ltag==1) pre=p->lchild;
else
{
for(q=p->lchild;q->rtag==0;q=q->rchild)
pre=q;
}
return pre;
}
寻找后继:
同理有线索树的性质可得,当其rtag=1时表示其rchild中保存的是后继,否则保存的是lingk
所以对于结点p,当p->rtag=1,则p->rchild直接表示的是后继,否则说明他有右子数,按照中序遍历的规则,只有当其右子树全部遍历完才遍历它,因此其后继应该是右子树的最左下端结点(中序先左后中再右)
BiTNode *Inpre(BiTNode *p)
{
if(p->rtag==1) pre=p->rchild;
else
{
for(q=p->rchild;q->ltag==0;q=q->lchild)
pre=q;
}
return pre;
}