第五章 二叉树的线索化
5.3_5如何找到中序遍历的前驱
先进行中序遍历
指针q 先指向中序遍历的第一个节点,判断和p是否是一个节点,不是的话继续指针后移
直到相等记录下指针的位置
中序线索化
中序线索化二叉树代码
typedef int ElemType; //为 int 类型取一个新的名字,方便重新修改二叉树结构体中的数据类型
/*线索二叉树结点(结构体)*/
typedef struct TreadNode
{
ElemType data;
struct TreadNode *lchild,*rchild;
int ltag,rtag;
}ThreadNode,*ThreadTree;
//全局变量 pre,指向当前访问结点的前驱
ThreadNode *pre = NULL;
void InThread(ThreadTreeT)
{
if(T !=NULL)
{
findpre(T->lchild);
visit(T);
findpre(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;
}
void CreateInThread(ThreadTree T)
{
pre = NULL; //pre初始化为NULL
if(T != NULL) //非空二叉树才能线索化
{
InThread(T); //中序线索化二叉树
if(pre->rchild == NULL) //不判断也可以,中序遍历最后一个节点的右孩子必定为空
pre->rtag = 1; //处理最后一个结点
}
}
先序代码
需要解决一个转圈问题
typedef int ElemType; //为 int 类型取一个新的名字,方便重新修改二叉树结构体中的数据类型
/*线索二叉树结点(结构体)*/
typedef struct TreadNode
{
ElemType data;
struct TreadNode *lchild,*rchild;
int ltag,rtag;
}ThreadNode,*ThreadTree;
//全局变量 pre,指向当前访问结点的前驱
ThreadNode *pre = NULL;
//先序遍历二叉树,遍历同时线索化
void PreThread(ThreadTreeT)
{
if(T !=NULL)
{
visit(T); //遍历根节点
if(T->ltag == 0) //lchild不是前驱线索(防止线索化后原地打转)
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;
}
void CreateInThread(ThreadTree T)
{
pre = NULL; //pre初始化为NULL
if(T != NULL) //非空二叉树才能线索化
{
PreThread(T); //中序线索化二叉树
if(pre->rchild == NULL)
pre->rtag = 1; //处理最后一个结点
}
}