对称序线索二叉树总结之周游

线索二叉树根据其线索周游很方便

中序周游

void nInOrder(ThrTree t){
   ThrTree p=t;
   if(t==NULL)
    return ;
    while(p->llink!=NULL&&p->ltag==0) p = p->llink; //左节点不为空,顺左节点一直向下
    while(p!=NULL){
      visit(*p); //周游
      if(p->rlink!=NULL&&p->rtag==0){ //右节点不是线索 此时其左子树是空
        p=p->rlink; //指向右节点
        while(p->llink!=NULL && p->ltag==0) p = p->llink; //右子树的左节点不为线索 ,顺着右节点的左子树一直向下
      }
      else p = p->rlink; //是线索就顺着线索向下
    }
}

前序周游

void ThreadPreOrder(PBinTree t)
{
  ThrTree p=t;
  if(t == NULL)
    return ;
  else visit(*p);
  while(p != NULL)
  {
    if( p->llink!=NULL && p->ltag==0 ){ // 又左节点就一直访问,直到左节点为空,此时p指向左节点的上面。
      p=p->llink;visit(*p);
    }
    else if( p->rlink!=NULL && p->rtag==0 ){ //如果没有左节点,那么访问右节点,直到其右节点也为空。
      p=p->rlink;visit(*p);
    }
    else if( p->rlink->rlink!=NULL){ //因为上面的条件均不成立,因此p-rlink一定是指向中序遍历的后继节点,访问!
      p=p->rlink->rlink;visit(*p);
    }
    else break;//条件都不成立,退出大循环。
  }
}

如何求前序的后继呢?
对上述程序做修改即可
如何求后序的前驱呢?

BiThrTree InPostPre (BiThrTree p)
//在中序线索二叉树t中,求指定结点p在后序下的前驱结点q
{
  BiThrTree q;
  if (p->rtag==0) 
    q=p->rchild; //若p有右子女,则右子女是其后序前驱
  else if (p->ltag==0) 
    q=p->lchild; //若p无右子女而有左子女,左子女是其后序前驱。
  else if(p->lchild==null) 、
    q=null;//p是中序序列第一结点,无后序前驱
  else //顺左线索向上找p的祖先,若存在,再找祖先的左子女
  {
    while(p->ltag==1 && p->lchild!=null) 
      p=p->lchild;
    if(p->ltag==0) 
      q=p->lchild; //p结点的祖先的左子女是其后序前驱
    else 
      q=null; //仅右单枝树(p是叶子),已上到根结点,p结点无后序前驱
  }
  return(q); 
}//结束InPostPre
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值