今天有个函数运行的时候出错了,一直在找问题解决问题,然后简单复习了下线索二叉树
二叉树的存储表示
typedef struct BiThrNode
{
TElemtype data;
struct BiThrNode *lchild,*rchild;//左右孩子
int LTag,Rtag; //左右标志
} BiThrNode,*BiThrTree;
以这种节点结构构成二叉树的存储结构,叫线索链表,其中结点前驱和后继的指针,叫做线索。加上线索的二叉树称之为线索二叉树。对二叉树以某种次序遍历使其变为线索二叉树的过程叫做线索化
以节点p为根的子树中序线索化
[算法步骤]
①如果p非空,左子树递归线索化。
②如果p的左孩子为空,则给p加上左线索,将其LTag置为1,让p的左孩子
指针指向pre (前驱) ;否则将p的LTag置为0。
③如果pre的右孩子为空,则给pre加上右线索,将其RTag置为1,让pre的右
孩子指针指向p (后继) ;否则将pre的RTag置 为0。
④将pre指向刚访问过的结点p,即pre=p。
⑤右子树递归线索化。
void InThreading(BiThrTree p)
{
if(p)
{
InThreading(p->lchild);
if(!p->lchild)
{
p->LTag=1;
p->lchild=pre;
}
else
{
p->LTag=0;
}
if(!pre->rchild)
{
pre->RTag=1;
pre->rchild=p;
}
else
{
pre->RTag=0;
}
pre=p;
InThreading(p->rchild );
}
}
带头结点的二叉树中序线索化
void InOrderThreading(BiThrTree &Thrt,BiThrTree T)
{
Thrt=new BiThrNode;
Thrt->LTag=0;
Thrt->Rtag=1;
Thrt->rchild=Thrt;
if(!T)
{
Thrt->lchild=Thrt;
}
else
{
Thrt->lchild=T;
pre=Thrt;
InThreading(T);
pre->rchild=Thrt;
pre->RTag=1;
Thrt->rchild=pre;
}
}
遍历中序线索二叉树
[算法步骤]
①指针p指向根结点。
②p为非空树或遍历未结束时,循环执行以下操作:
- 沿左孩子向下, 到达最左下结点*p,它是中序的第一个结点;
- 访问*p
- 沿右线索反复查找当前结点*p的后继结点并访问后继结点,直至右线索为0或者遍历结束;
- 转向p的右子树。
void InOrderTraverse(BiThrTree T)
{
p=T->lchild;
while(p!=T)
{
while(p->LTag==0)
{
p=p->lchild;
}
printf("%d",p->data);
while(p->RTag==1&&p->rchild!=T)
{
p=p->rchild;
printf("%d",p->data);
}
p=p->rchild;
}
}