线索二叉树

本文介绍了如何通过中序遍历对二叉树进行线索化,以存储每个节点的前驱和后继。在遍历过程中,利用ltag和rtag标志指示左右孩子或前驱后继的存在,通过全局变量btlinkpre记录前驱节点,确保在遍历过程中正确建立线索。同时,提供了头指针的初始化和收尾工作的处理,确保线索化过程的完整性和正确性。
摘要由CSDN通过智能技术生成

通过对二叉树的约定遍历方式 可以得到一个固定的遍历方式
存放前驱和后继的空间
每隔一个结点都有浪费空间 所以我们就将它利用存前驱和后继
yes 中序遍历具备这样的特点
将已经定义好的结构进行扩容
ltag 与 rtag
ltag=0 指向左孩子 =1 指向前驱

前驱 用pre保存当前结点的前驱
后继该结点的下一个

btlink pre;//全局变量保存足迹  结点的前一个 即前驱 始终指向刚刚访问过的结点 
//中序遍历线索化
void InThreading(btlink T)
{
	if(T)
	{
	    InThreading(T->left);// 左子树线索化 
	    //结点处理 
	    if(!T->left)//结点没有左孩子  left指向前驱 
	    {
	    	T->ltag=1;
			T->left=pre; 
		}
		if(!pre->right)//走过去才知道后继是谁 所以pre是走过的结点指导后继 
		{
			pre->rtag=1;
			pre->right=T;
		}
		pre=T;
		InThreading(T->right);// 右子树 
    }
 } 

这是一个线索化的动态过程 在刚开始时pre没有赋值 所以开始会出现 错误 我们定义一个头指针
void InOderThreading(btlink T,btlink p)
{
p=new Btnode;//头指针相当于pre
p->ltag=0;//左指针指向树的根节点
p->rtag=1;//右指针线索化
p->right=p;//右指针 先 指向自己
if(!T)//判断树是否树为空
{
p->left=p;
}
else
{
p->left=T;//左指针指向空结点
pre=p;//先驱结点
InThreading(T);//线索化
//收尾工作
pre->right=p;
pre->rtag=1;
p->right=pre;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值