二叉树的线索化
笔者学习过程中,借鉴博客:https://blog.csdn.net/One_castle/article/details/102968998]
结点类型
struct BiThrNode{
int date;
struct BiThrNode *lchild,*rchild;
int LTag,RTag;
};
LTag
0 lchild指示左孩子
1 lchild指示结点前驱
RTag
0 rchild指示右孩子
1 rchild指示结点后继
线索化
BiThrNode* pre = NULL;//指向上一次访问的节点
void InThreading(BiThrNode* root) {
BiThrNode* p = root;//指向当前节点的指针
if (p!= NULL) {
InThreading(p->lchild);
if (p->lchild == NULL) {//当前结点没有左孩子
p->lThread = true;
p->lchild = pre;//左子树指向前驱
}
if (pre->rchild == NULL) {//上一节点没有右孩子
pre->rThread = true;
pre->rchild = p;//右子树指向后继
}
pre = p;//pre指向上一次访问的节点
InThreading(p->rchild);
}
}
处理头节点
void InOrderThreading(BiThrNode* &Thrt,BiThrNode* T){
if(!(Thrt = (BiThrNode*)malloc(sizeof(BiThrNode)));
Thrt->LTg = false;
Thrt->RTag = true;
Thrt->rchild = Thrt;
if(!T)
Thrt->lchild = Thrt;
else{
Thrt->lchild = T;
pre = Thrt;
InThreading(T);
pre->rchild = Thrt;//此时pre指向右子树的最右结点
pre->RTag = true;
Thrt->rchild = pre;
}
return OK;
}//关系见图