1.遍历中序线索二叉树
遍历线索二叉树,只要从头结点出发反复找结点的后继,直到又回到头结点时止。查找一个结点的后继有两种情况:
如果结点的右线索标志rtag=1,右指针所指即为中序后继。如果结点的右线索rtag=0,该结点有右孩子,由中序遍历的定义知其后继结点应是它的右子树上的最左下结点;即沿着它的右孩子结点的左指针链一直往下找,当某结点左线索标志为1时,该结点就是要找的最左下结点。下面给出遍历中序线索二叉树的算法描述:
void inorderthr(bithrtree t)//遍历中序线索二叉树t,t为头结点指针
{
bithrtree p;//定义遍历过程中的指针变量
p=t->lchild;//p指向根结点
while(p!=t)//空树或遍历结束时p=t
{
while(p->ltag==0)
p=p->lchild;//找最左下结点
printf("%d\n",p->data);//访问结点
while((p->rtag==1)&&(p->rchild!=t))
{
p=p->rchild;//若右指针为线索作指针传递并访问它
printf("%d\n",p->data);
}
p=p->rchild;//当右指针非线索时,p指向右孩子,下一个要找的是最左下结点
}
}2.中序线索二叉树的逆中序遍历
所谓逆中序遍历,是先逆中序遍历右子树,然后访问根结点,最后逆中序遍历左子树。其遍历结果序列与中序序列正好相反,即从中序序列的最后一个结点到第一个结点的次序。
实现逆中序遍历,只要从中序线索树的头结点出发,有rchild域找到中序的最后一个结点,然后反复查找结点的前趋结点,直到又回到头结点时止。确定一个结点的前趋结点有两种情况:如果结点的左线索标志ltag=1,其左指针域lchild所指即为前趋。如果itag=0;说明结点有左孩子,根据中序遍历的定义其前趋结点应是其左子树上的最右下结点;即沿着其左孩子的右指针链一直向下查找,当某结点的右线索标志为1,即rtag=1时,这个结点就是所要找的最右下结点。算法描述如下:
void reverseinorder(bithrtree t)//逆中序遍历中序线索二叉树t,t为头结点指针
{
bithrtree p;//定义遍历过程中的指针变量
p=t->rchild;//p指向中序遍历的最后一个结点
while(p!=t)//当未遍历结束反复做下面的
{
printf("%d\n",p->data);//访问结点
if(p->ltag==0)//如果左孩子存在
{
p=p->lchild;//P指向左孩子
while(p->rtag==0) //找左子树的最右下结点
p=p->rchild;
}
else
p=p->lchild;//如果无左孩子,p指向线索所指前趋结点
}
}
3737

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



