您的位置:首页 > 其它

线索化二叉树

2011-12-14 13:23 253 查看
仿照线性表的存储结构,在二叉树的线索链表上也添加一个头结点head,头结点的指针域的安排是:

◆ Lchild域:指向二叉树的根结点;

◆ Rchild域:指向中序遍历时的最后一个结点;

◆ 二叉树中序序列中的第一个结点Lchild指针域和最后一个结点Rchild指针域均指向头结点head。

如同为二叉树建立了一个双向线索链表,对一棵线索二叉树既可从头结点也可从最后一个结点开始按寻找直接后继进行遍历。显然,这种遍历不需要堆栈。

#define MAX_NODE 50

typedef enmu{Link , Thread} PointerTag ;

/* Link=0表示指针, Thread=1表示线索 */

typedef struct BiThrNode

{

ElemType data;

struct BiTreeNode *Lchild , *Rchild ;

PointerTag Ltag , Rtag ;

}BiThrNode;

1 先序线索化二叉树

void preorder_Threading(BiThrNode *T)

{

BiThrNode *stack[MAX_NODE];

BiThrNode *last=NULL, *p ;

int top=0 ;

if (T!=NULL)

{

stack[++top]=T;

while (top>0)

{

p=stack[top--] ;

if (p->Lchild!=NULL) p->Ltag=0 ;

else

{

p->Ltag=1 ;

p->Lchild!=last ;

}

if (last!=NULL)

if (last->Rchild!=NULL) last->Rtag=0 ;

else

{

last->Rtag=1 ;

last->Rchild!=p ;

}

last=p ;

if (p->Rchild!=NULL)

stack[++top]=p->Rchild ;

if (p->Lchild!=NULL)

stack[++top]=p->Lchild ;

}

Last->Rtag=1; /* 最后一个结点是叶子结点 */

}

}

2 中序线索化二叉树

void inorder_Threading(BiThrNode *T)

{

BiThrNode *stack[MAX_NODE];

BiThrNode *last=NULL, *p=T ;

int top=0 ;

while (p!=NULL||top>0)

if (p!=NULL)

{

stack[++top]=p;

p=p->Lchild;

}

else

{

p=stack[top--] ;

if (p->Lchild!=NULL) p->Ltag=0 ;

else

{

p->Ltag=1 ;

p->Lchild=last ;

}

if (last!=NULL)

if (last->Rchild!=NULL) last->Rtag=0 ;

else

{

last->Rtag=1 ;

last->Rchild=p ;

}

last=p ;

p=p->Rchild;

}

last->Rtag=1; /* 最后一个结点是叶子结点,last->Rchild此时为NULL */

}

线索二叉树的遍历

1 先序线索二叉树的先序遍历

void preorder_Thread_bt(BiThrNode *T)

{

BiThrNode *p=T ;

while (p!=NULL)

{

visit(p->data) ;

if (p->Ltag==0) p=p->Lchild ;

else p=p->Rchild

}

}

2 中序线索二叉树的中序遍历

void inorder_Thread_bt(BiThrNode *T)

{

BiThrNode *p ;

if (T!=NULL)

{

p=T;

while (p->Ltag==0 )

p=p->Lchild; /* 寻找最左的结点 */

while (p!=NULL)

{

visit(p->data) ;

if (p->Rtag==1) p=p->Rchild ; /* 通过右线索找到后继 */

else /* 否则,右子树的最左结点为后继 */

{

p=p->Rchild ;

while (p->Ltag==0 ) p=p->Lchild;

}

}

}

}

对于后序遍历的线索树中找结点的直接后继比较复杂,可分以下三种情况:

◆ 若结点是二叉树的根结点:其直接后继为空;

◆ 若结点是其父结点的左孩子或右孩子且其父结点没有右子树:直接后继为其父结点;

◆ 若结点是其父结点的左孩子且其父结点有右子树:直接后继是对其父结点的右子树按后序遍历的第一个结点。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: