二叉树的线索化

前驱或者后继指的是深度优先遍历序列中的顺序
一般的遍历中(深度优先遍历和层次遍历)需要用栈或队列保存父节点的信息

而二叉树的线索化(给出一条直接指向其前驱或者后继的路径)是
将空指针指向其所在节点在遍历序列中前驱(左空指针)或者后继(右空指针)

中序线索化(最常见)

底部的是空分支(指针=NULL)

在这里插入图片描述

遍历序列的头尾没有前驱或者后继,所以还存在两个空指针

线索二叉树的存储结构:

typedef struct BTNode{int data; BTNode* LChild; BTNode* RChild;}BTNode;//二叉树的存储结构
typedef struct BTNode{int data; BTNode* LChild; BTNode* RChild;int Ltag;int Rtag;}BTNode;//线索二叉树的存储结构

当tag=1时叶子节点的线索指针起作用


二叉树的(先序)遍历&树的(先序)遍历&图的(深度优先)遍历

void f (TBNode *p,TBTNode *&pre)// 注意多了一个参数pre当前所访问节点的前驱节点,pre初始化NULL
{
  if(p!=NULL)
  {
      f(p->LChild,pre);
      
      if(p->LChild==NULL){p->LChild =pre;p->Ltag =1;}
      if(p->RChild==NULL && pre!=NULL){pre->RChild =p;pre->Rtag =1;}
      pre=p;
      
      f(p->RChild,pre);
  }
}

在这里插入图片描述

先序:
void f (TBNode *p,TBTNode *&pre)// 注意多了一个参数pre当前所访问节点的前驱节点,pre初始化NULL
{
  if(p!=NULL)
  {
     
      
      if(p->LChild==NULL){p->LChild =pre;p->Ltag =1;}
      if(p->RChild==NULL && pre!=NULL){pre->RChild =p;pre->Rtag =1;}
      pre=p;
      if(p->Ltag==0)//注意细节
      f(p->LChild,pre);
       if(p->Rtag==0)
      f(p->RChild,pre);
  }
}
后序:
void f (TBNode *p,TBTNode *&pre)// 注意多了一个参数pre当前所访问节点的前驱节点,pre初始化NULL
{
  if(p!=NULL)
  {
      f(p->LChild,pre);
      
     
      
      f(p->RChild,pre);
       if(p->LChild==NULL){p->LChild =pre;p->Ltag =1;}
      if(p->RChild==NULL && pre!=NULL){pre->RChild =p;pre->Rtag =1;}
      pre=p;
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值