前一阵写的中序线索二叉树有点错误,这次改正了,重新写了一下。代码如下。
#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;//输出最后一个结点的值
}