二叉树线索化
线索二叉树类型定义
typedef char ElemType;
typedef struct ThreadTree{
ElemType data;
struct ThreadTree *lchild,*rchild;
int ltag,rtag;
}ThreadNode,* ThreadTree;
二叉树结点初始化
void InitThreadNode(ThreadNode *T){
T->lchild=NULL;
T->rchild=NULL;
T->ltag=0;
T->rtag=0;
}
先序线索二叉树的构造
void PreThread(ThreadTree T,ThreadNode **pre){
if(T!=NULL){ //当树不为空时
if(T->lchild==NULL){ //当前结点左子树为空时
T->lchild=(*pre); //让该结点的左孩子指针指向前一个先序遍历序列前一个结点
T->ltag=1;
}
if((*pre)!=NULL && (*pre)->rchild==NULL){ //当前驱结点的的右子树为空时
(*pre)->rchild=T; //让前驱结点的右孩子结点指向当前遍历的结点
(*pre)->rtag=1;
}
(*pre)=T;
if(T->ltag==0) //(重点)只有当当前遍历的结点的左孩子指针不为线索时
PreThread(T->lchild,pre);
PreThread(T->rchild,pre);
}
}
void CreatePreThead(ThreadTree T){
ThreadNode *pre=NULL;
if(T!=NULL){
PreThread(T,&pre);
if(pre->rchild==NULL) //处理先序遍历序列最后一个结点
pre->rtag=1;
}
}
中序线索二叉树的构造
void InThread(ThreadTree T,ThreadNode **pre){
if(T!=NULL){ //当树不为空时
InThread(T->lchild,pre);
if(T->lchild==NULL){ //当前结点左子树为空时
T->lchild=(*pre); //让该结点的左孩子指针指向前一个先序遍历序列前一个结点
T->ltag=1;
}
if((*pre)!=NULL&& (*pre)->rchild==NULL){ //当前驱结点的的右子树为空时
(*pre)->rchild=T; //让前驱结点的右孩子结点指向当前遍历的结点
(*pre)->rtag=1;
}
(*pre)=T;
InThread(T->rchild,pre);
}
}
void CreateInThead(ThreadTree T){
ThreadNode *pre=NULL;
if(T!=NULL){
InThread(T,&pre);
if(pre->rchild==NULL) //处理中序遍历序列最后一个结点
pre->rtag=1;
}
}
后序线索二叉树的构造
void PostThread(ThreadTree T,ThreadNode **pre){
if(T!=NULL){ //当树不为空时
PostThread(T->lchild,pre);
PostThread(T->rchild,pre);
if(T->lchild==NULL){ //当前结点左子树为
T->lchild=(*pre); //让该结点的左孩子指针指向前一个先序遍历序列前一个结点
T->ltag=1;
}
if((*pre)!=NULL && (*pre)->rchild==NULL){ //当前驱结点的的右子树为空时
(*pre)->rchild=T; //让前驱结点的右孩子结点指向当前遍历的结点
(*pre)->rtag=1;
}
}
}
void CreatePostThead(ThreadTree T){
ThreadNode *pre=NULL;
if(T!=NULL){
PostThread(T,&pre);
if(pre->rchild==NULL) //处理后序遍历序列最后一个结点
pre->rtag=1;
}
}