中序线索二叉树的实现

前一阵写的中序线索二叉树有点错误,这次改正了,重新写了一下。代码如下。

  #include<iostream>
  using namespace std;

 struct node{
 int data;//数据域
 node*left;//左子树
 node*right;//右指针
 int ltag;//左标志
 int rtag;//右标志
};
class binarytree{
 node*root;//根结点
                binarytree(){root=NULL;}
                void creattree(node*&t);//创建树的函数,用先序递归创建树。
                void inthreading(node*&t,node*&pre);//终须线索化
               void In();//调用inthreading的函数
                node*getin(node*t);//得到中序遍历的后继结点指针
                void showin();//中序遍历
};
void binarytree::creattree(node*&t){
            int x;
           cin>>x;
           if(x==0) t=NULL;//如果输入的是0,则该指针为空
                 else{否则分配动态空间
                          node*p=new node;
                          p->data=x;
                          t=p;
                          t->ltag=0;
                          t->rtag=0;
                         creattree(t->left);
                         creattree(t->right);
                      }
}
 void binarytree::inthreading(node*&t,node*&pre){//pre为前一次次中序遍历到的结点
          if(t==NULL) return ;//若为空则返回
         else{
                    inthreading(t->left,pre);//先线索化左子树
                        if(t->left==NULL){
                            t->left=pre;
                            t->ltag=1;
                         }
                          if(pre&&!pre->right){//因为pre的初始值是NULL因此要先判断pre是否为空
                              pre->rtag=1;
                              pre->right=t;
                           }
                                 pre=t;//保存前一次中序遍历的结点,作为下个被遍历结点的前驱
                                 inthreading(t->right,pre);//线索化有子树
               }
}
void binarytree::In(){
                node*pre=NULL;//初始化pre为空
                inthreading(root,pre);线索化二叉树
}
node* binarytree::getin(node*t){//得到线索二叉树的后继结点
           if(!t->rtag){//若有子树不为空,那么他的后继结点,就是有子树中 “最左端” 即第一个左孩子为空(ltag=1)的节点
               node*p=t->right;
                while(!p->ltag)//若左孩子不为空继续
                   p=p->left;
                   return p;
            }
          return t->right;//若右孩子是中序线索,则右孩子既是后继
}
void binarytree::showin(){
            node*t=root;
            while(t->left) t=t->left;//找到中序的第一个被遍历的结点
                   while(t->right){//若不是最后一个结点(最后一个结点无后继,所以右孩子为空)
                        cout<<t->data<<' ';
                        t=getin(t);得到后继指针
                   }
            cout<<t->data;//输出最后一个结点的值
}

 


 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值