#include<iostream>
#include<cstdio>
#define maxn 11111
#define m 3
using namespace std;
typedef struct k
{
char data;
struct k *child[m];
}Tree;
Tree *createbypre(Tree *t)
{
char c;
cin>>c;
if(c=='#') return NULL;
t=new Tree;
t->data=c;
for(int i=0;i<m;i++)
t->child[i]=createbypre(t->child[i]);
return t;
}
void prepost(Tree *t)
{
if(t==NULL) return ;
cout<<t->data;
for(int i=0;i<m;i++)
prepost(t->child[i]);
}
void kuohao(Tree *t)//根据前序遍历的括号表示法
{
int k =0 ;
if(t==NULL) return ;//到达叶子节点,则返回
cout<<t->data;//输出根节点
while(k<m&&t->child[k]==NULL) k++;//看根节点有没有儿子节点
if(k==m) return ;//若没有则直接返回
cout<<'(';//有的话就输出左括号,代表儿子节点的区间开始
int i=k;
while(i<m)
{
if(t->child[i]!=NULL) //如果儿子节点存在
{
kuohao(t->child[i]);//输出该节点的同时找该节点是否有儿子节点
i++;//看该节点有没有兄弟,从下一个开始找
while(i<m&&t->child[i]==NULL) i++;//看是否存在这样的兄弟
if(i!=m) cout<<',';//存在则输出,
}else i++;
}
if(k!=m) cout<<')';//最后则输出右括号
}
void aoru(Tree *t,int d)//根据前序遍历的凹入表示法
{
if(t==NULL) return ;
for(int i=0;i<10;i++)
if(i<d) printf(" ");
else if(i==d) printf("%c",t->data);
else printf("--");
printf("\n");
for(int i=0;i<m;i++) aoru(t->child[i],d+1);
}
int main()
{
Tree *t;
t=createbypre(t);
prepost(t);
cout<<endl;
kuohao(t);
cout<<endl;
aoru(t,1);
return 0;
}
孩子指针表示法关于前序遍历的括号表示和凹入表示
最新推荐文章于 2023-04-24 15:25:48 发布