线索二叉树
线索二叉树即从前、中、后序三种遍历中其中一种来看,树中的左右孩子都不会是空着的,都会指向对应的前驱和后驱。
以中序遍历为例,二叉树线索化过程如下:
先是树的结构
typedef struct ThreadNode{
Elemetype data;
struct ThreadNode *lchild,*rchild;
int ltag,rtag;
}ThreadNode,*ThreadTree;
void InThread(ThreadTree &p,ThreadTree &pre){//记录当前节点和前驱节点
if(p!=NULL){
InThread(p->lchild,pre);//先看左子树
if(p->lchild==NULL){//对左孩子进行修改
p->lchild=pre;
p->ltag = 1;
}
if(pre!=NULL&&pre->rchild==NULL){//对右孩子进行修改
pre->rchild=p;
pre->rtag=1;
}
pre = p;//在下次搜索前及时修改前驱
InThread(p->rchild,pre);//看右子树
}
}
将树进行线索化
void CreateInThread(ThreadTree T){
ThreadTree pre = NULL;
if(T!=NULL){
InThread(T,pre);
pre->rchild = NULL;
pre->rtag = 1;//对最后一个节点进行修改
}
}
接下来是遍历线索树
ThreadNode *Firstnode(ThreadNode *p){
while(p->ltag==0) p = p->lchild;
return p;
}//找出左下第一个节点
ThreadNode *Nextnode(ThreadNode *p){
if(p->rtag = 0) return Firstnode(p->rchild);
else return p->rchild;
}//寻找下一个节点
void vist(ThreadNode *p){
printf("%d",p->data);
}
void Inorder(ThreadNode *T){
for(ThreadNode *p = Firstnode(T);p!=NULL;p = Nextnode(p))
vist(p);
}