二叉树线索化

 

#include<iostream.h>
#include<malloc.h>
typedef enum pointertag{link,thread};//link==0:指针,threak==1:线索
typedef struct bithrnode
{
  char data;
  struct bithrnode *lchild,*rchild;//左右孩子指针
  pointertag ltag,rtag;  //左右标志
} bithrnode,*bithree;
bithrnode *pre;
//bithree &thrt;
char Createbithree(bithree &p)
{   char ch;
    cin>>ch;
    if (ch=='#') p= NULL;
    else
 {  
        if (!(p = new bithrnode))
        return 1;
        p->data = ch;              // 生成根结点
       Createbithree(p->lchild);   // 构造左子树
       Createbithree(p->rchild);   // 构造右子树
    }
    //return 0;
} // CreateBiTree
//中序线索化
void inthreading(bithree p)
{
    if(p)
 { 
         inthreading(p->lchild);//左子树线索化
         if(!p->lchild)
             //如果没有左孩子
   {  
             p->ltag=thread;
             p->lchild=pre;
   }  //前驱线索


        if(!pre->rchild)
                             //如果没有右孩子
  {
            pre->rtag=thread;
            pre->rchild=p;
  }                             //后继线索
         pre=p;                      //保持pre始终指向p的前驱
         inthreading(p->rchild);   //右子树线索化
 }
}
//中序遍历中序线索化链表
char inorderthreding(bithree p,bithree &thrt)
{
  if(!(thrt=(bithrnode *)malloc(sizeof(bithrnode))))
    return 1;
   thrt->ltag=link;
   thrt->rtag=thread;
   thrt->rchild=thrt;    //建立头结点
 if(p)
  thrt->lchild=thrt;     //如果二叉树为空,则左指针回指
 else
 {
       thrt->lchild=p;
       pre=thrt;
       inthreading(p);         //中序遍历进行中序线索化
       pre->rchild=thrt;
       pre->rtag=thread;
       thrt->rchild=pre;
 }
   return 0;
}
void printbithree(bithree &p)
{

    if(p)
 {
 
           printbithree(p->lchild);
        cout<<p->data<<endl;
           printbithree(p->rchild);
 }
 
    return;
}

int main()
{


bithree S=NULL,thrt=NULL;

cout<<"创建二叉树"<<endl;
Createbithree(S);
cout<<"中序线索化"<<endl;
inorderthreding(S,thrt);
cout<<"输出"<<endl;
printbithree(S);

return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值