建立与遍历中序线索树

PBiTNode pre;   //全局变量会分配一个静态空间,和NULL不是同一个
void Inthread(PBiTNode root) //初始pre取NULL
{
    //对root所指的二叉树进行中序线索化,其中pre始终指向刚访问过的结点,其初值为NULL
    if(root!=NULL)
    {
       Inthread(root->LChild); //线索化左子树
       if(root->LChild==NULL)  //置前驱线索
       {
           root->Ltag=1;  root->LChild=pre;
       }
       else  root->Ltag=0;
       if(pre!=NULL&&pre->RChild==NULL)   //置后继线索
       {
           pre->Rtag=1;   root->RChild=pre;
       }
       else  pre->Rtag=0;
       pre=root;      //当前访问结点为下一访问结点的前驱
       Inthread(root->RChild); //线索化右子树
    }
}
//中序线索树找结点后继
PBiTNode InNext(PBiTNode p)
{
   PBiTNode   next,q;
   //p的右子树为空,由后继线索链直接得到后继结点
   if(p->Rtag == 1)  next=p->RChild;
   else
   {
      //p的右子树不为空
      //在p的右子树中查找“最左下端” 结点,该结点就是p的后继
      for(q=p->RChild; q->Ltag == 0 ;q=q->LChild ) ;  //右左右左
      next=q;
   }
   return next;
}
//中序线索树找前驱结点
PBiTNode InPre(PBiTNode p)
{
   PBiTNode   pre,q;
   if(p->Ltag==1)  pre=p->LChild;
   else
   {
       //在p的左子树中查找“最右下端” 结点,该结点就是p的后继
       for(q=p->LChild;q->Rtag==0;q=q->RChild)   //左右左右
       pre=q;
   }
   return pre;
}
//在中序线索树上求中序遍历的第一个结点
//最左结点就是第一个
PBiTNode InFirst(PBiTNode Bt)
{
    PBiTNode p=Bt;
    if(!p)  return NULL;
    while(p->Ltag == 0)  p=p->LChild;
    return p;
}
//遍历中序二叉树
void TInOrder(PBiTNode Bt)
{
    PBiTNode p;
    p=InFirst(Bt);
    while(p)
    {
        //visit(p); //读取想要的值
        p=InNext(p);
    }
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值