5.3.2 二叉树的线索化


#include<stdio.h>
//中序遍历
void InOrder(BiTree T){
if(T!=NULL){
InOrder(T->lchild);//递归遍历左子树
visit(T);//访问根节点
InOrder(T->rchild);//递归遍历右子树
}
}
//访问结点q
void visit(BiTNode * q){
if(q==p)//当前访问结点刚好是结点p
final = pre;//找到p的前驱
else
pre = q;//pre指向当前访问的结点
}
//辅助全局变量,用于查找结点p的前驱
BiTNode *p;//p指向目标节点
BiTNode * pre=NULL;//指向当前访结点的前驱
BiTNode * final=NULL; //用于记录最终结果

//线索二叉树
typedef struct ThreadNode{
ElemType data;
struct ThreadNode *lchild,*rchild;
int ltag,rtag; //左右线索标志
}ThreadNode,* ThreadTree;
//中序遍历
void InThread(ThreadTree T){
if(T!=NULL){
InThread(T->lchild);//递归遍历左子树
visit(T);//访问根节点
InThread(T->rchild);//递归遍历右子树
}
}
void visit(ThreadNode *q){
if(q->lchild==NULL){//左子树为空,建立前驱线索
q->lchild=pre;
q->ltag=1;
}
if(pre!=NULL&&pre->rchild==NULL){
pre->rchild=q;//建立前驱结点的后继线索
pre->rtag=1;
}
pre=q;
}
//全局变量 pre 指向当前访问结点的前驱
ThreadNode *pre =NULL;

//全局变量pre,指向当前访问结点的前驱
ThreadNode *pre=NULL;
//中序线索化二叉树T
void CreatInThread(ThreadTree T){
pre=NULL;//pre初始为NULL
if(T!=NULL){//非空线索化才能线索化
InThread(T);//中序线索化二叉树
if(pre->rchild==NULL)
pre->rtag=1;//处理遍历的最后一个结点
}
}
//线索二叉树
typedef struct ThreadNode{
ElemType data;
struct ThreadNode *lchild,*rchild;
int ltag,rtag; //左右线索标志
}ThreadNode,* ThreadTree;
//中序遍历
void InThread(ThreadTree T){
if(T!=NULL){
InThread(T->lchild);//中序遍历左子树
visit(T);//访问根节点
InThread(T->rchild);//中序遍历右子树
}
}
void visit(ThreadNode *q){
if(q->lchild==NULL){//左子树为空,建立前驱线索
q->lchild=pre;
q->ltag=1;
}
if(pre!=NULL&&pre->rchild==NULL){
pre->rchild=q;//建立前驱结点的后继线索
pre->rtag=1;
}
pre=q;
}








