孩子指针表示法关于前序遍历的括号表示和凹入表示

来源:互联网 发布:服装cad软件排名 编辑:程序博客网 时间:2024/04/28 04:31
#include<iostream>#include<cstdio>#define maxn 11111#define m 3using 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;}


1 0