中序线索化
//中序遍历
typdef struct ThreadNode{ //线索二叉树
ElemType data; //数据项
struct ThreadTree *lchild,*rchild; //左孩子右孩子
int ltag,rtag; //线索标识(初始化为0,若左孩子是空指针则ltag设为1,右孩子同理)
}ThreadNode, *ThreadTree;
void InThread(ThreadTree T){
//线索化的本质为一个中序遍历
//如果T == NULL;InThread将会什么都不做回退到上次层InThread
if(T != NULL){
InThread(T -> lchild);
visit(T);
InThread(T -> rchild);
}
}
void visit(ThreadNode *q){
//当前节点左孩子为空,设置前驱为pre节点,修改线索标识
if(q -> lchild == NULL){
q -> lchild = pre;
q -> ltag = 1;
}
//当前节点的前驱节点非空
//只有首次访问时pre为空,后续访问由于遍历时T!= NULL的返回条件,不会有空的pre节点
if(pre != NULL && pre -> rchild == NULL){
pre -> rchild = q;
pre -> rtag = 1;
}
//由于中序遍历第一次访问是在“一路向左”的末端,所以首个访问节点的左孩子为空
//因此初始化全局变量pre为NULL
//后续每次访问完成后将当前节点设置为pre
pre = p;
}
void CreadInThread(ThreadTree T){
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 PreThread(ThreadTree T){
visit(T);
if(T -> ltag == 0)
PreThread(T -> lchild);
PreThread(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;
}