线索二叉树的实质就是
将二叉链表的空指针改为前驱或后继的线索,线索化的过程就是在
遍历的过程中修改空指针的过程。
以中序遍历线索化为例:
/* Link==0表示指向左右孩子指针 */
/* Thread==1表示指向前驱或后继的线索 */
typedef enum {Link, Thread} PointerTag;
/* 二叉线索存储结点结构 */
typedef struct BiThrNode
{
TElemType data;
struct BiThrNode *lchild, *rchild;
PointerTag LTag;
PointerTag RTag;
} BiThrNode, *BiThrTree;
BiThrTree pre; /* 全局变量, 始终指向刚刚访问过的结点 */
void InThreading(BiThrTree p)
{
if(p)
{
InThreading(p.lchild); //递归左子树
if(!p.child) //如果没有左孩子,前驱则为pre,存入lchild
{
p.LTag = Thread; //指示左孩子指针存的是前驱结点
p.lchild = pre;
}
if(!pre.rchild) //如果前驱没有右孩子,则其rchild存放当前结点指针,即后继
{
pre.RTag = Thread;
pre.