线索化二叉树
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;
}
}
}
}
对于后序遍历的线索树中找结点的直接后继比较复杂,可分以下三种情况:
◆ 若结点是二叉树的根结点:其直接后继为空;
◆ 若结点是其父结点的左孩子或右孩子且其父结点没有右子树:直接后继为其父结点;
◆ 若结点是其父结点的左孩子且其父结点有右子树:直接后继是对其父结点的右子树按后序遍历的第一个结点。
◆ 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;
}
}
}
}
对于后序遍历的线索树中找结点的直接后继比较复杂,可分以下三种情况:
◆ 若结点是二叉树的根结点:其直接后继为空;
◆ 若结点是其父结点的左孩子或右孩子且其父结点没有右子树:直接后继为其父结点;
◆ 若结点是其父结点的左孩子且其父结点有右子树:直接后继是对其父结点的右子树按后序遍历的第一个结点。
相关文章推荐
- 第十一周 中序线索化二叉树的算法验证
- 线索化二叉树--节点空指针实现过程
- 线索化二叉树
- 二叉树(二)---线索化二叉树
- 二叉树中序线索
- 数据结构——c语言描述 第六章(1)二叉树树的基本操作和二叉树的线索化
- 线索化二叉树
- 线索化二叉树、线索二叉树的遍历
- 第十一周项目1-二叉树算法验证(中序线索化二叉树的算法验证 )
- 第十一周项目1-验证算法(3)中序线索化二叉树的算法验证
- 线索化二叉树C++
- 第十一周项目1—验证算法(3)中序线索化二叉树的算法验证
- 第10周项目3- 中序线索化二叉树的算法验证
- 线索化二叉树的创建及遍历
- 线索化二叉树
- 第11周项目1 验证算法(3)中序线索化二叉树的算法验证
- 第11周项目1-验证算法(3)中序线索化二叉树的算法验证
- 第十一周项目1——二叉树算法验证(3) 中序线索化二叉树的算法验证
- 第十一周项目1 - 二叉树算法验证(3)中序线索化二叉树的算法验证
- 第十一周 项目1:二叉树算法验证(3) 中序线索化二叉树的算法验证