线索二叉树

在一棵具有n个节点二叉树中,若采用二叉链表存储结构,在2n个指针域中有n+1个空指针域,线索二叉树就是利用这些空指针来指向节点的前驱节点或后驱节点从而使二叉树的某些操做得到优化的目的,如何区别某个指针存放的究竟是指针还是线索呢?主要有以下两种方法:

  1. 每个节点新增两个标志位域lbit和rbit,有
p->lbit = 0p-> lchild 为指向前驱的线索
p->lbit = 1p->lchild为指向左孩子的指针
  1. 不改变节点的构造,仅在作为线索的地址前面加一个负号,即负的地址表示线索,正的表示指针(不常用)

线索二叉树的构造:

定义二叉链表结构类型:

typedef struct node
{
    Elemtype data;
    struct node *lchild,*rchild;
    int lbit,rbit;
}TBTNode,*TBTREE;

定义好节点之后,我们首先来建立一棵线索二叉树。这里以中序二叉树的线索化为例。
说明: prior指针指向当前访问节点的直接前驱节点,prior的初值为头结点的指针,HEAD初始值指向头结点,但在算法执行过程中,HEAD总是指向当前访问的节点。

void INTHREAD(TBTREE &HEAD)
{
    TBTREE piror;
    if(HEAD){
        INTHREAD(HEAD->lchild);
        if(HEAD->rchild == NULL){
            HEAD->rbit = 0;
        }
        if(HEAD->lchild == NULL){
            HEAD->lchild = piror;
            HEAD->lbit = 0;
        }
    }
    if(piror->rbit == 0){
        piror->rchild = HEAD;
    }
    piror = HEAD;
    INTHREAD(HEAD->rchild);
}

线索二叉树的利用:

1:在中序线索二叉树中确定地址为x的节点的直接前驱节点

分析:

  1. x->lbit = 0;x->lchild所指节点就是x的直接前驱节点。
  2. x->lbit = 1;说明x节点有左子树,它的直接前驱节点就是x节点左子树最右边的那个节点;即顺着x节点左子树的根的右指针链往下寻找直到某节点的rchild域是线索为止。代码如下:
TBTREE INPRIOR(TBTREE x)
{
    TBTREE s;
    s = x->lchild;
    if(x->lchild)
        while(s->rbit == 1)
        s = s->rchild;
    return s;
}

在中序线索二叉树中确定地址为x的节点的直接后驱节点

分析:

  1. x->rbit = 0; x->rchild所指节点就是x的直接后驱节点
  2. x->ribt = 1;沿着x节点的右子树的根的左指针链往下找,直到某节点的lchild域为线索为止。 代码如下:
TBTREE INSUCC(TBTREE x)
{
    TBTREE s;
    s = x->rchild;
    if(s)
        while(s->lbit == 1)
        s = s->lchild;
    return s;
}

利用线索二叉树遍历二叉树

TBTREE INSUCC(TBTREE x)
{
    TBTREE s;
    s = x->rchild;
    if(s)
        while(s->lbit == 1)
        s = s->lchild;
    return s;
}

线索二叉树的更新:

void INSERT_RIGHT(TBTREE s,TBTREE p)
{
    TBTREE q;
    p->rchild = s->rchild;
    p->rbit = s->rbit;
    p->lchild = s;
    s->rchild = p;
    s->rbit = 1;
    if(p->rbit == 1){
        q = INSUCC(P);               //如果s原来的右子树非空时,找到s的直接继          节点w,将w改为p的直接后继节点,p改为w的直接前继节点
        q->lchild = p;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
创建线索二叉树是一种对二叉树进行优化的数据结构。它的目的是为了加快二叉树的遍历速度。在传统的二叉树中,为了实现对二叉树的遍历,需要使用递归或者栈来实现。而线索二叉树通过添加线索,将二叉树的节点之间的遍历顺序进行编码,从而实现快速遍历。 在线索二叉树中,每个节点都有两个指针:左指针和右指针。在一棵二叉树中,如果一个节点没有左孩子,则将其左指针指向该节点的前驱节点。如果一个节点没有右孩子,则将其右指针指向该节点的后继节点。通过这样的线索指针,可以快速地找到一个节点的前驱和后继节点,进而实现对二叉树的快速遍历。 具体来说,在线索二叉树中,如果一个节点没有左孩子,则将其左指针指向其前驱节点;如果一个节点没有右孩子,则将其右指针指向其后继节点。通过这样的线索化过程,原本需要递归或者栈来实现的遍历过程,可以直接通过线索指针快速找到下一个需要遍历的节点,从而提高了遍历的效率。 总的来说,线索二叉树是一种优化的二叉树结构,通过添加线索指针,将二叉树的节点之间的遍历顺序进行编码,从而实现了对二叉树的快速遍历。它的设计思想主要是通过设置节点的线索指针指向前驱和后继节点,提高了遍历效率,减少了递归或栈的使用。这是一个在实际应用中常用的数据结构,可以广泛应用于二叉树遍历的场景中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值