/*
  先序线索化
*/
#include<stdio.h>
#include<stdlib.h>

//建立线索二叉树存储结构
typedef struct ThreadNode{
int data; //数据元素
struct ThreadNode *lchild,*rchild; //左右子树
int ltag,rtag; //左右线索标志
}ThreadNode,*ThreadTree;

//先序线索化二叉树
void PreThread(ThreadTree &p,ThreadTree &pre){
if(p!=NULL){
/*visit()*/
if(p->lchild==NULL){ //左子树为空,建立前驱线索
p->lchild=pre;
p->ltag=1;
}
if(pre!=NULL&&pre->rchild==NULL){
pre->rchild=p; //右子树为空,建立后继线索
pre->rtag=1;
}
pre=p;
if(p->ltag==0){
PreThread(p->lchild,pre); //递归线索化左子树
}
PreThread(p->rchild,pre); //递归线索化右子树
}
}
//建立线索化二叉树
void CreatePreThread(ThreadTree T){
ThreadTree pre=NULL;
if(T!=NULL){ //非空二叉树——线索化
PreThread(T,pre); //线索化二叉树
pre->rchild=NULL; //处理遍历的最后一个结点
pre->rtag=1;
}
}

int main(){

}

 

/*
中序线索化
*/

#include<stdio.h>
#include<stdlib.h>

//建立线索二叉树存储结构
typedef struct ThreadNode{
int data; //数据元素
struct ThreadNode *lchild,*rchild; //左右子树
int ltag,rtag; //左右线索标志
}ThreadNode,*ThreadTree;

//线索化二叉树
void InitThread(ThreadTree &p,ThreadTree &pre){
if(p!=NULL){
InitThread(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;
InitThread(p->rchild,pre);
}
}
//建立线索化二叉树
void CreateInitThread(ThreadTree T){
ThreadTree pre=NULL;
if(T!=NULL){
InitThread(T,pre);
pre->rchild=NULL;
pre->rtag=1;
}
}

int main(){

}

 

/*
后序线索化
*/

#include<stdio.h>
#include<stdlib.h>

//建立线索二叉树存储结构
typedef struct ThreadNode{
int data; //数据元素
struct ThreadNode *lchild,*rchild; //左右子树
int ltag,rtag; //左右线索标志
}ThreadNode,*ThreadTree;

//后序线索化二叉树
void PostThread(ThreadTree &p,ThreadTree &pre){
if(p!=NULL){
PostThread(p->lchild,pre); //递归线索化左子树
PostThread(p->rchild,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;
}
}
//建立线索化二叉树
void CreatePostThread(ThreadTree T){
ThreadTree pre=NULL;
if(T!=NULL){ //非空二叉树——线索化
PostThread(T,pre); //线索化二叉树
pre->rchild=NULL; //处理遍历的最后一个结点
pre->rtag=1;
}
}

int main(){

}