说明:文章内容来自课程课件!
如果已经通过遍历(前序,中序或后序)得到线索二叉树。
那么,对线索化的二叉树进行遍历就比对一般二叉树进行遍历更加有效和方便。
中序全线索二叉树的遍历算法
① 结束的条件? 树空或者指针指向头结点
② 中序遍历的第一个结点 ?左子树上处于“最左下”(没有左子树)的结点
③ 在中序线索二叉树中结点的后继 ?
若无右子树,则右线索所指结点为后继 否则,右子树的“最左下”孩子为后继;
说明:
typedef enum PointerThr{ Link, Thread } ; // Link==0:指针,Thread==1:线索
void InOrderTraverse_Thr(BiThrTree T, void (*Visit)(TElemType e)) {
p = T->lchild; // T指向头结点,p指向根结点
while (p != T) { // 空树或遍历结束时,p==T
while (p->LTag==Link) p = p->lchild; // 最左下结点
Visit(p->data) ; // 访问最左下结点
while (p->RTag==Thread && p->rchild !=T)
{p = p->rchild; Visit(p->data); } // 访问后继结点
p = p->rchild; // p进至其右子树根或头结点
}
} // InOrderTraverse_Thr
最大的疑问是为什么根据这样执行就可以遍历整个二叉树???
欢迎评论和指点!!!