/*
用例:
输入:abdg空空h空空e空空cf空空空
中序:dbagecf
*/
include
include
include
define SIZE 50
typedef struct btnode
{
char data;
struct btnode* lchild;
struct btnode* rchild;
bool ltag;
bool rtag;
}BTNode,*BiTree;
void preCreatTree(BiTree* ptree)
{
char ch=getchar();
getchar();
if(ch==’ ‘) *ptree=NULL;
else
{
ptree=(BTNode)malloc(sizeof(BTNode));
(*ptree)->data=ch;
(*ptree)->ltag=false;
(*ptree)->rtag=false;
preCreatTree(&((*ptree)->lchild));
preCreatTree(&((*ptree)->rchild));
}
}
void inOrderThreadlize(BiTree root,BiTree* pre)
{
if(!root)
{
return;
}
inOrderThreadlize(root->lchild,pre);
if(!root->lchild)
{
root->ltag=true;
root->lchild=(*pre);
}
if(!(*pre)->rchild)
{
(*pre)->rtag=true;
(*pre)->rchild=root;
}
*pre=root;
inOrderThreadlize(root->rchild,pre);
}
void creatLoopThreadBiTree(BiTree root,BTNode* header)
{
if(!root||!header) return;
BTNode* pre=header;
inOrderThreadlize(root,&pre);//这句之后,pre指向中序最后一个结点
pre->rtag=true;
pre->rchild=header;
header->ltag=true;
header->lchild=pre;
}
BTNode* getSuccessor(BTNode* pnode)
{
if(!pnode)
{
return NULL;
}
if(pnode->rtag)
{
return pnode->rchild;
}
BTNode* pscan=pnode->rchild;
while(pscan->ltag==false)
{
pscan=pscan->lchild;
}
return pscan;
}
BTNode* getProccessor(BTNode* pnode)
{
if(!pnode)
{
return NULL;
}
if(pnode->ltag)
{
return pnode->lchild;
}
BTNode* pscan=pnode->lchild;
while(pscan->rtag==false)
{
pscan=pscan->rchild;
}
return pscan;
}
int main()
{
BiTree root;
preCreatTree(&root);
BTNode* header=(BTNode*)malloc(sizeof(BTNode));
creatLoopThreadBiTree(root,header);
for(BTNode* p=header->rchild;p!=header;p=getSuccessor(p))
{
printf(“%c\t”,p->data);
}
printf(“\n”);
for(BTNode* p=header->lchild;p!=header;p=getProccessor(p))
{
printf(“%c\t”,p->data);
}
printf(“\n”);
}