线索二叉树,指定次序下查找结点的前驱和后继算法都变得简单。

1)中序线索二叉树

  1. 查找p的前驱:查左线索;若无左线索,结点的前驱是遍历左子树时访问的最后一个结点。

  2. 查找p的后继:查右线索;若无右线索,结点的后继是遍历右子树时访问的第一个结点。

2)先序线索二叉树

  1. 查找p的前驱:查左线索;若无左线索,结点的前驱是结点的双亲结点,或是先序遍历其双亲结点左子树时最后访问的结点。

  2. 查找p的后继:查右线索;若无右线索,结点的后继必为结点的左子树(若存在)或右子树根结点。

3)后序线索二叉树

  1. 查找p的前驱:查左线索;若无左线索,且无右线索时,结点的前驱是右子树根结点;若无左线索,但是有右线索时,结点的前驱是左子树根结点。

  2. 查找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在后序序列中的前驱

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值