通过对二叉树的约定遍历方式 可以得到一个固定的遍历方式
存放前驱和后继的空间
每隔一个结点都有浪费空间 所以我们就将它利用存前驱和后继
yes 中序遍历具备这样的特点
将已经定义好的结构进行扩容
ltag 与 rtag
ltag=0 指向左孩子 =1 指向前驱
前驱 用pre保存当前结点的前驱
后继该结点的下一个
btlink pre;//全局变量保存足迹 结点的前一个 即前驱 始终指向刚刚访问过的结点
//中序遍历线索化
void InThreading(btlink T)
{
if(T)
{
InThreading(T->left);// 左子树线索化
//结点处理
if(!T->left)//结点没有左孩子 left指向前驱
{
T->ltag=1;
T->left=pre;
}
if(!pre->right)//走过去才知道后继是谁 所以pre是走过的结点指导后继
{
pre->rtag=1;
pre->right=T;
}
pre=T;
InThreading(T->right);// 右子树
}
}
这是一个线索化的动态过程 在刚开始时pre没有赋值 所以开始会出现 错误 我们定义一个头指针
void InOderThreading(btlink T,btlink p)
{
p=new Btnode;//头指针相当于pre
p->ltag=0;//左指针指向树的根节点
p->rtag=1;//右指针线索化
p->right=p;//右指针 先 指向自己
if(!T)//判断树是否树为空
{
p->left=p;
}
else
{
p->left=T;//左指针指向空结点
pre=p;//先驱结点
InThreading(T);//线索化
//收尾工作
pre->right=p;
pre->rtag=1;
p->right=pre;
}
}