一.线索二叉树的定义:
//线索二叉树结点
typedef struct ThreadNode{
ElemType data;
struct TheadNode *lchild,*rchild;
int ltag,rtag; //左右线索标志
}ThreadNode,*ThreadTree;
二.简单方法找到中序前驱:
//中序遍历
void FindPre(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 TheadNode{
ElemType data;
Struct TheadNode *lchild,*rchild;
int ltag,rtag; //左右线索标志
}TheadNode,*TheadTree;
//全局变量pre,指向当前访问结点的前驱
ThreadNode *pre=NULL;
//中序遍历二叉树,一边遍历一边线索化
void InThread(ThreadTree T){
if(T!=NULL){
InThrad(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;
}
//中线索线索化二叉树T
void CreateInThread(ThreadTree T){
pre=NULL; //根结点没有前驱,初始前驱为空
if(T!=NULL){
InThread(T);//中序线索化二叉树(已经封装在前面的函数了)
if(pre->rchild==NULL)
pre->rtag=1; //处理遍历的最后一个结点(特殊处理)
}
}
四.先序线索化:(特殊情况的处理)
加一个判断if(T->ltag==0)
避免一直转圈。
ThreadNode *pre=NULL;
void PreThread(ThreadTree T){
if(T!=NULL){
visit(T);
if(T->ltag==0) //lchild不是前驱线索
preThread(T->lchild);
preThread(T->rchild);
}
}
void visit(TreadNode *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;
}
void CreatePreThread(ThreadTree T){
pre=NULL;
if(T!=NULL){
preThread(T);
if(pre->rchild==NULL)
pre->rtag=1;
}
}
本文介绍了线索二叉树的概念,包括其节点结构和如何通过中序遍历找到结点的中序前驱。同时,详细阐述了中序线索化的步骤,通过中序遍历过程建立结点之间的线索连接。此外,还提及了先序线索化过程中的特殊情况处理,防止无限循环。
6430

被折叠的 条评论
为什么被折叠?



