zoukankan      html  css  js  c++  java
  • 树的括号表示+树的孩子表示线性结构实现

    #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;
    }
    

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

  • 相关阅读:
    DHCP脚本
    7.31
    7.30
    7.26
    7.24
    VLAN与三层交换机
    静态路由配置
    7.17
    四次挥手
    TCP三次握手,四次挥手
  • 原文地址:https://www.cnblogs.com/Thereisnospon/p/4768513.html
Copyright © 2011-2022 走看看