中序線索二叉樹的構造:
typedef struct TBNode
{
int data;
int ltag,rtag;
TBNode *lchild;
TBNode *rchild;
}TBTNode;
//通過中序遍歷對二叉樹線索化
void InThread(TBTNode *p,TBTNode *&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(TBTNode *root)
{
TBTNode *pre=NULL;
if(root!=NULL)
{
InThread(root,pre);
pre->rchild=NULL;
pre->rtag=1;
}
}
//找到中序遍歷中的第一個結點
TBTNode *First(TBTNode *p)
{
while(p->ltag==0)
p=p->rchild;
return p;
}
//找到中序遍歷下的後繼結點
TBTNode *Next(TBTNode *p)
{
if(p->rtag==0)
return First(p->rchild);
else
return p->rchild;
}
前序線索二叉樹:
//前序線索二叉樹的構造
void preThread(TBTNode *p,TBTNode *&pre)
{
if(p!=NULL)
{
if(p->lchild==NULL)
{
p->lchild=pre;
p->ltag=1;
}
if(pre!=NULL&&pre->rchild==NULL)
{
pre->rchild=p;
pre->rtag=1;
}
pre=p;
if(p->ltag==0)
preThread(p->lchild,pre);
if(p->rtag==0)
preThread(p->rchild,pre);
}
}
//在前序線索二叉樹上執行前序遍歷
void preorder(TBTNode *root)
{
if(root!=NULL)
{
TBTNode *p=root;
while(p!=NULL)
{
while(p->ltag==0)
{
Visit(p);
p=p->lchild;
}
Visit(p);
p=p->rchild;
}
}
}
後序線索二叉樹:
void postThread(TBTNode *p,TBTNode *&pre)
{
if(p!=NULL)
{
postThread(p->lchild,pre);
postThread(p->rchild,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;
}
}