对线索二叉树的结构定义如下:
struct Node
{
int data;
int ltag,rtag; //线索标记;
Node* lchild;
Node* rchild;
};
如果ltag = 0,则 lchild为指针,指向节点的左孩子,若ltag = 1,则 lchild为线索,指向节点的直接前驱;
如果rtag = 0,则 rchild为指针,指向节点的右孩子,若rtag = 1,则 rchild为线索,指向节点的直接后继;
以下是中序遍历对二叉树线索化的递归算法:
void InThread(Node *p, Node *&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); //对右子树线索化
}
}
通过中序遍历建立线索二叉树的主程序如下:
void createInThread(Node *root)
{
Node *pre = NULL; //前驱节点指针
if(root != NULL)
{
InThread(root,pre);
pre->rchild = NULL;
pre->rtag = 1; //对最后一个节点线索化;
}
}