#include<bits/stdc++.h>
using namespace std;
typedef char ElemType;
typedef struct BiThrnode
{
char data;
BiThrnode *lchild,*rchild;
int ltag;
int rtag; // 1为线索,0为左孩子或右孩子
} BiThrnode, *BiThrTree;
//全局变量,指向刚刚访问过的结点
BiThrTree pre;
// 创建一棵二叉树,约定前序遍历方式
void CreatBiThrTree(BiThrTree *T)
{
char c;
c=cin.get();
if(c==' ')
{
*T=NULL;
}
else
{
*T=(BiThrnode *)malloc(sizeof(BiThrnode));
(*T)->data=c;
(*T)->ltag=0;
(*T)->rtag=0;
CreatBiThrTree(&(*T)->lchild);
CreatBiThrTree(&(*T)->rchild);
}
}
//中序遍历线索化
void InTreading(BiThrTree T)
{
if(T)
{
InTreading(T->lchild); // 递归左孩子线索化
if(!T->lchild) // 如果该结点没有左孩子,设置ltag为1,并把lchild指向刚刚访问的结点
{
T->ltag = 1;
T->lchild = pre;
}
if(!pre->rchild)
{
pre->rtag=1;
pre->rchild=T;
}
pre = T;
InTreading(T->rchild); //递归又孩子线索化
}
}
void InorderTreading(BiThrTree *p,BiThrTree T)
{
*p=new BiThrnode;
//*p=(BiThrnode *)malloc(sizeof(BiThrnode));
(*p)->ltag=0;
(*p)->rtag=1;
(*p)->rchild=*p;
if(!T)
{
(*p)->lchild =*p;
}
else
{
(*p)->lchild=T;
pre=*p;
InTreading(T);
pre->rchild=*p;
pre->rtag=1;
(*p)->rchild=pre;
}
}
void visit(char c)
{
cout<<c<<" ";
}
//中序遍历二叉树,非递归
void PrintTree(BiThrTree T)
{
BiThrTree p;
p=T->lchild;
while(p!=T)
{
while(p->ltag==0)
{
p=p->lchild;
}
visit(p->data);
while(p->rtag==1&&p->rchild!=T)
{
p=p->rchild;
visit(p->data);
}
p=p->rchild;
}
}
int main()
{
BiThrTree p,T=NULL;
CreatBiThrTree(&T);
InorderTreading(&p,T);
PrintTree(p);
return 0;
}
线索二叉树(构建并输出)
最新推荐文章于 2022-12-14 19:54:31 发布