大二数据结构5(线索二叉树)

  • List item

一.定义

  • 前驱与后继:在二叉树的先序、中序或后序遍历序列中两个相邻的结点互称为前驱与后继。
  • 线索:指向前驱或后继结点的指针称为线索。
  • 线索二叉树:加上线索的二叉链表表示的二叉树叫线索二叉树。
  • 线索化:将二叉树变为线索二叉树的过程称为线索化。

二. 指针域

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三.线索链表的类型描述:

typedef struct BiThrNode {
   TElemType  data;
   BiThrNode  *lchild, *rchild;  // 左右指针
   int ltag, rtag;    // 左右标志, 0:指针,1:线索
} BiThrNode,*BiThrTree;

四. 建立线索二叉树

附设一个指针pre始终指向刚访问的结点,若指针p指向当前访问的结点,则pre指向他的前驱。
下面以中序线索树的建立为例,介绍在中序遍历过程中如何修改结点的左、右指针域,以保存当前访问结点的“前驱”和“后继”信息。附设指针pre, 并始终保持指针pre指向当前访问的由指针p所指结点的前驱。

// 建前驱线索
if (p->lchild==NULL)      
  {    
        p->ltag = 1;    
         p->lchild = pre; 
}
// 建后继线索
if (pre->rchild==NULL)   
  { 
       pre->rtag = 1;   
        pre->rchild = p; 
} 

在这里插入图片描述

  • 头结点: ltag=0, lchild指向根结点
  • rtag=1, rchild指向遍历序列中最后一个结点
  • 遍历序列中第一个结点的lchild域和最后一个结点的rchild域都指向头结点
#include <iostream>

using namespace std;
void inorderthreading(bitree &thrt,bitree t)
{
    thrt=new bitree;
    thrt->ldag=0;
    thrt->rdag=1;
    if(!t) thrt->rchild=pre;//如果树为空
    else  {
         thrt->lchild=t;//头结点与树的根链接
         pre=thrt;//pre为遍历节点的p的前驱
         inthreathing(t)//对t进行线索化
         pre->rchild=thrt;//线索化完即遍历到最后一个右节点,将右节点的后驱为pre,所以将pre的右节点与头链接
         pre->rtag=1;
        //将这个标志变成1
        
    }  
}
void inthreathing(bitree t)//递归法线索化
{
    if(p)
    {
        intreathing(t->lchild);
        if(!p->lchild)
          {   p->ltag=1;
              p->rchild=pre;
          }
        if(!pre->rchild)
          {   pre->rtag=1;
              pre->rchild=p;
          }
         pre=p;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值