树的括号表示+树的孩子表示线性结构实现

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define M 3
#define MAX 200
typedef char type;
typedef struct node//树节点
{
    type data;
    int child[M];//孩子节点的位置信息
}treenode;
typedef struct//树
{
    treenode tnode[MAX];
    int root;//根节点位置信息
    int length;//树的节点个数
}tree;
char str[MAX]="1(2.3(4.5))";//数的括号表示的字符串
void BrackToTree(tree *t,char s[])
{
    int stack[MAX];
    int ti=0,si=0,done=1,top=0,i,parent;
    t->tnode[ti].data=s[si++];t->root=0;//根节点保存在0处
    for(i=0;i<M;i++)//根节点子节点位置初始化
        t->tnode[ti].child[i]=-1;
    while(done)//还没有结束
    {
        if(s[si]=='(')//如果是左括号,说明进入了当前树的子节点中,将该节点的位置保存在栈中
              stack[top++]=ti;
        else if(s[si]==')')//如果是右括号,说明当前树的子节点结束,将当前树退栈
        {
            top--;
            if(top==0)//如果栈已空,说明处理完毕
                done=0;
        }
        else if(s[si]=='.')//如果是'.'跳过
            ;
        else if(s[si]=='')//字符串结束
            done=0;
        else
        {
            ti++;//向数中添加一颗树,树位置ti加一
            t->tnode[ti].data=s[si];
            for(i=0;i<M;i++)//将新增的树的子节点初始化
                t->tnode[ti].child[i]=-1;
            parent=stack[top-1];//得到栈顶元素的位置信息,即该树的双亲位置
            i=0;
            while(t->tnode[parent].child[i]!=-1)//再改树的双亲中寻找适当位置
                i++;
            t->tnode[parent].child[i]=ti;//将当前树插入到双亲的相应位置中
        }
        si++;//继续访问括号字符串的下一个字符
    }
    t->length=ti+1;//修改树的节点个数
}
void preorder(tree *t,int pos)//数的前序遍历
{
    if(t&&pos<t->length)
    {
        int i;
        printf("%c ",t->tnode[pos].data);
        for(i=0;i<M;i++)
            if(t->tnode[pos].child[i]!=-1)
                preorder(t,t->tnode[pos].child[i]);
    }
}
void postorder(tree *t,int pos)//树的后序遍历
{
    if(t&&pos<t->length)
    {
        int i;
        for(i=0;i<M;i++)
            if(t->tnode[pos].child[i]!=-1)
                postorder(t,t->tnode[pos].child[i]);
        printf("%c ",t->tnode[pos].data);
    }
}
void Levelorder(tree*t)//树的层次遍历
{
    printf("树的层次遍历: ");
    int queue[MAX],front=0,rear=0;
    if(t->root!=-1)
        queue[rear++]=t->root;
    while(front<rear)
    {
        int pos=queue[front++],i;
        printf("%c ",t->tnode[pos].data);
        for(i=0;i<M;i++)
            if(t->tnode[pos].child[i]!=-1)
            queue[rear++]=t->tnode[pos].child[i];
    }
    printf("
");
}
void Postorder(tree*t)
{
    printf("树的后序遍历:");
    postorder(t,t->root);
    printf("
");
}
void Preorder(tree*t)
{
    printf("树的前序遍历: ");
    preorder(t,t->root);
    printf("
");
}
void show(tree *t)//显示保存树节点数组中的所有信息
{
    int i,j;
    for(i=0;i<t->length;i++)
       {
           printf("%c ",t->tnode[i].data);
           for(j=0;j<M;j++)
                printf("	%d",t->tnode[i].child[j]);
           printf("
");
       }
}
int main()
{
    tree t,*pt=&t;
    BrackToTree(pt,str);
    show(pt);
    Preorder(pt);
    Postorder(pt);
    Levelorder(pt);
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

原文地址:https://www.cnblogs.com/Thereisnospon/p/4768513.html