查找线索二叉树的前驱和后继

看书一直没想明白、、、二叉树即使有线索了,对于左右子树都非空的二叉树,从后继怎么找到的前驱啊,找不到啊。啊。啊。(中序的)

搜了个代码看看,果然清晰透彻,浑身酥爽。自从上次看懂KMP算法时,体验到浑身颤抖的感觉后,就打算将数据结构继续学下去。


中序线索化算法:

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. //将二叉树按中序线索化算法  
  2. typedef enum   {Link,Thread} PointerTag;//枚举值分别为0,1  
  3. typedef struct node  
  4. {  
  5.     DataType data;  
  6.     PointerTag ltag,rtag;   //左右标志  
  7.     struct node *lchild ,*rchild;  
  8. }BinThrNode;//线索二叉树节点类型  
  9. typedef BinThrNode *BinThrTree;  
  10. void InorderThreading(BinThrTree p)  
  11. {//将二叉树p中序线索化  
  12.     if(p)//p非空时,当前访问结点是*p  
  13.     {  
  14.         InorderThreading(p->lchild);//左子树线索化  
  15.         //建立正在访问节点的前驱结点之间的线索  
  16.         t->ltag = (t->lchild)?Link:Thread;  
  17.         t->rtag = (t->rchild)?Link:Thread;  
  18.         if(pre)  
  19.         {  
  20.             if(pre->rtag==Thread)  
  21.                 pre->rchild = p;  
  22.             if(p->ltag==Thread)  
  23.                 p->lchid = pre;  
  24.         }  
  25.         pre = p;  
  26.         InorderThreading(t->rchild);//右子树线索化  
  27.     }  
  28. }  

前驱和后继的查找

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. BinThrNode *InorderSuccessor(BinThrNode *p)  
  2. {//在中序线索树查找*p的后继  
  3.     BinThrNode *q;  
  4.     if(p->rtag==Thread)  
  5.         return p->rchlid;//返回其所指的后继  
  6.     else  
  7.     {  
  8.         q = p->rchild;//从*p的右孩子开始查找  
  9.         while(q->ltag==Link)  
  10.             q = q->lchild;//左子树为空,沿左链往下查找  
  11.         return q;  
  12.     }  
  13. }  
  14.  BinThrNode *Inorderpre(BinThrNode *p)  
  15.       {//在中序线索树中找结点*p的中序前趋,设p非空  
  16.          BinThrNode *q;  
  17.         if (p->ltag==Thread) //*p的左子树为空  
  18.                return p->lchild; //返回左线索所指的中序前趋  
  19.          else{  
  20.                q=p->lchild; //从*p的左孩子开始查找  
  21.                while (q->rtag==Link)  
  22.                     q=q->rchild; //右子树为空时,沿右链往下查找  
  23.                return q; //当q的右子树为空时,它就是最右下结点  
  24.              } //end if  
  25.       }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值