数据结构——将二叉树线索化(C++)

1. 线索二叉树的存储结构

typedef struct BiThrNode
{
    char date;//数据域
    struct BiThrNode *lchild,*rchild;
    int ltag;//左标记
    int rtag;//有标记
}BiThrNode,*BiThrTree;

2. 二叉树的中序线索化

(1)实现步骤

  • 设置一个指针pre,始终指向刚刚访问过的结点(当前结点的前一个结点),刚开始pre置为NULL;

  • 从树根开始,先遍历到最深的左孩子结点,如果该结点没有左孩子,将ltag置为1,令lchild指针指向pre前驱,否则将ltag置为0,其lchild指针仍然指向左孩子结点;

  • 如果前驱没有右孩子结点,将前驱的rtag置为1做标记,令其rchild指针指向当前结点p,保持pre=p继续遍历,接着遍历右子树。

(2)图示

 (3)代码实现

BiThrTree pre=new BiTreNode;
void InThreading(BiThrTree& p,BiThrTree& pre)
{
    //使用两个结点p、pre
    //初始时pre为空,p为根结点
    //注意pre始终比慢一步
    if(p!=NULL)
    {
        InThreading(p->lchild,pre);//递归,线索化左子树
        if(p->lchild==NULL)
        {//左子树为空时,建立前驱线索
            p->ltag=1;
            p->lchild=pre;
}
        else p->ltag=0;//左子树不为空则ltag为0,左指针指向其左孩子
        if(pre!=NULL&&pre->rchild==NULL)
        {//pre(当前结点即p)不为空且其右子树为空则建立后继线索
            pre->rtag=1;
            pre->rchild=p;
}
        else pre->rtag=0;//右子树不为空则ltag为0,右指针指向其右孩子
        pre=p;//pre后移
        InThreading(p->rchild);//递归,线索化右子树
}
}
void CreatInThrd(BiThrTree& T) 
{
	BiThrTree pre = NULL;	//因为第一个结点一开始无前驱
	if (T != NULL) 
	{
		InThreading(T, pre);	//线索化二叉树
		pre->rchild = NULL;	//处理到了最后一个结点,pre指向最后一个结点,右孩子设为空表示最后一个结点 
		pre->RTag = 1; 		//表示指针 
	}
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值