线索二叉树上的运算实现

1.遍历中序线索二叉树

遍历线索二叉树,只要从头结点出发反复找结点的后继,直到又回到头结点时止。查找一个结点的后继有两种情况:

如果结点的右线索标志rtag=1,右指针所指即为中序后继。如果结点的右线索rtag=0,该结点有右孩子,由中序遍历的定义知其后继结点应是它的右子树上的最左下结点;即沿着它的右孩子结点的左指针链一直往下找,当某结点左线索标志为1时,该结点就是要找的最左下结点。下面给出遍历中序线索二叉树的算法描述:

void inorderthr(bithrtree t)//遍历中序线索二叉树t,t为头结点指针
{
    bithrtree p;//定义遍历过程中的指针变量
    p=t->lchild;//p指向根结点
    while(p!=t)//空树或遍历结束时p=t
    {
        while(p->ltag==0) 
            p=p->lchild;//找最左下结点
        printf("%d\n",p->data);//访问结点
        while((p->rtag==1)&&(p->rchild!=t))
        {
            p=p->rchild;//若右指针为线索作指针传递并访问它
            printf("%d\n",p->data);
        }
        p=p->rchild;//当右指针非线索时,p指向右孩子,下一个要找的是最左下结点
    }
}

2.中序线索二叉树的逆中序遍历

所谓逆中序遍历,是先逆中序遍历右子树,然后访问根结点,最后逆中序遍历左子树。其遍历结果序列与中序序列正好相反,即从中序序列的最后一个结点到第一个结点的次序。

实现逆中序遍历,只要从中序线索树的头结点出发,有rchild域找到中序的最后一个结点,然后反复查找结点的前趋结点,直到又回到头结点时止。确定一个结点的前趋结点有两种情况:如果结点的左线索标志ltag=1,其左指针域lchild所指即为前趋。如果itag=0;说明结点有左孩子,根据中序遍历的定义其前趋结点应是其左子树上的最右下结点;即沿着其左孩子的右指针链一直向下查找,当某结点的右线索标志为1,即rtag=1时,这个结点就是所要找的最右下结点。算法描述如下:

void reverseinorder(bithrtree t)//逆中序遍历中序线索二叉树t,t为头结点指针
{
    bithrtree p;//定义遍历过程中的指针变量
    p=t->rchild;//p指向中序遍历的最后一个结点
    while(p!=t)//当未遍历结束反复做下面的
    {
        printf("%d\n",p->data);//访问结点
        if(p->ltag==0)//如果左孩子存在
        {
            p=p->lchild;//P指向左孩子
            while(p->rtag==0) //找左子树的最右下结点
                p=p->rchild;
        }
        else 
            p=p->lchild;//如果无左孩子,p指向线索所指前趋结点
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值