传统的二叉链表存储仅能体现一种父子关系,不能直接得到结点在遍历中的前驱或者后继。
线索二叉树的存储结构:
typedef struct ThreadNode
{
ElemType data;
struct ThreadNode *lchild, *rchild; //左右孩子指针
int ltag, rtag; //左右线索标志
}THreadNode, *ThreadTree;
ltag=0:lchild域指向结点的左孩子,ltag=1:lchild域指向结点的前驱;
rtal=0:rchild域指向结点的右孩子,rtag=1:rchild域指向结点的后继
第一个结点没有前驱,最后一个结点没有后继
中序遍历实现二叉树线索化
void InThread(THreadTree &p, THreadTree &pre)
{
if(p!=NULL)
{
InTHread(p->lchild, pre); //递归线索化左子树
if(p->lchild == NULL)
{
//左子树为空,建立前驱线索
p->lchild = pre;
p->ltag = 1;
}
if(pre!=NULL && pre->rchild == NULL)
{
//右子树为空
pre->rchild = p; //建立前驱节点的后继线索
pre->rtag = 1;
}
pre = p;
InThread(p->rchild, pre); //递归线索化右子树
}
}