33,027
社区成员




//------------------------------------------------------------------
//------------------------------------------------------------------
// 中序线索二叉树
//中序遍历线索二叉树,递归中序线索化
void InThreading( BiThrNode * p,BiThrNode * & pre )
{
if(p)
{
InThreading( p->lchild,pre );
if( !p->lchild )
{
p->LTag = Thread;
p->lchild = pre;
}
if( !pre->rchild )
{
pre->RTag = Thread;
pre->rchild = p;
}
pre = p;
InThreading( p->rchild,pre );
}
}
//中序遍历线索二叉树,并中序线索化,带头结点Thrt
void InOrderThreading( BiThrNode * & Thrt, BiThrNode * root )
{
Thrt = new BiThrNode;
Thrt->LTag = Link;
Thrt->RTag = Thread;
Thrt->rchild = Thrt;
BiThrNode * pre;
if( !root )
Thrt->lchild = Thrt;
else
{
Thrt->lchild = root;
pre = Thrt;
InThreading( root,pre );
pre->rchild = Thrt;
pre->RTag = Thread;
Thrt->rchild = pre;
}
}
//中序遍历线索二叉树的非递归算法
void InOrderTraverse_Thr( BiThrNode * Thrt )
{
BiThrNode * p = Thrt->lchild;
while( p != Thrt )
{
while( p->LTag == Link )
p = p->lchild; //找到最左边的子节点
cout<<p->data<<" ";
while( p->RTag == Thread && p->rchild != Thrt )
{
//访问后继结点
p = p->rchild;
cout<<p->data<<" ";
}
p = p->rchild;
}
}