1、线索二叉树结点构造
typedef struct TBTNode
{
char data;
int ltag,rtag;
TBTNode *lcihld; //为0,则指向左孩子;为1,则指向直接前驱
TBTNode *rchild; //为0,则指向右孩子;为1,则指向直接后继
}TBTNode;
中序遍历线索化
void inThread(TBTNode *p,TBTNode *&pre){ //p指向当前正在访问的结点,pre指向p的直接前驱结点。pre为p的直接前驱结点,p为pre的直接后继结点。
if(p!=NULL){
inThread(p->lcihld,pre); //递归,左子树线索化
if(p->lcihld==NULL){ //建立当前结点的前驱线索
p->lcihld=pre;
p->ltag=1;
}
if(pre!=NULL&&pre->rchild==NULL){
pre->rchild=p;
pre->rtag=1;
}
//经过上面两个if语句内的操作,p所指的结点的线索化已经完成
pre=p; //Dragon slayer will eventurally become a dragen. hhh
inThread(p->rchild,pre); //递归,右子树线索化
}
}
//通过中序遍历建立中序线索二叉树主程序
void createInThread(TBTNode *root){
TBTNode *pre=NULL;
if(root!=NULL){
InThread(root,pre);
pre->rchild=NULL;
pre->rtag=1; //非空二叉树线索化后,处理中序最后一个结点
}
}