表达式树的创建与输出

来源:互联网 发布:sdr软件无线电 飞行 编辑:程序博客网 时间:2024/06/07 06:59

问题 K: 表达式树的创建与输出
时间限制: 1 Sec 内存限制: 128 MB
提交: 539 解决: 311
[提交][状态][讨论版]
题目描述

编一个程序,读入先序遍历字符串,根据此字符串建立一棵二叉树(以指针方式存储),请注意的是,我们保证该树一定是表达式树(见教材5.2 5.8)。
例如下面的先序遍历字符串:
+ 13 # # * 5 # # 9 # #
运算符只可能是加减乘除,数值为小于等于100,各结点用空格分开,其中“#”代表空树。
这里写图片描述
建立起此二叉树以后,再按要求输出二叉树。
输入
输入由多组测试数据组成。

每组数据包含一行字符串,即表达式树的先序遍历序列,字符串长度大于0且不超过100。
输出
对于每组数据,输出一行,内容是该表达式树的全括号表达式,见示例。
样例输入
+ 13 # # * 5 # # 9 # #
* + 13 # # 5 # # 9 # #
样例输出
(13+(5*9))
((13+5)*9)

#include<stdio.h>#include<string.h>typedef struct binode{    char data[4];    int h;    int depth;    struct binode *lchild,*rchild;}binode,*bitree;char d[100][100];int q=0,num1;void creatbitree(bitree &T,int y,int num){    if(d[q][0]=='#') {T=NULL;q++;}    else    {        T=new binode;        if(y==1) T->h=1;        else T->h=0;        T->depth=++num;        strcpy(T->data,d[q++]);        creatbitree(T->lchild,1,T->depth);        creatbitree(T->rchild,0,T->depth);    }}void travel(bitree T){    int i;    if(T!=NULL)    {        if(T->data[0]=='+'||T->data[0]=='-'||T->data[0]=='*'||T->data[0]=='/')        {            printf("(");            travel(T->lchild);            printf("%s",T->data);        travel(T->rchild);        printf(")");        }        else        printf("%s",T->data);    }}int ldepth(bitree T){    if(T==NULL)        return 0;    num1=ldepth(T->lchild);    return num1+1;}int rdepth(bitree T){    if(T==NULL)        return 0;    num1=rdepth(T->rchild);    return num1+1;}int main(){    char a[500];    bitree T;    while(gets(a)!=NULL)    {        int i,j=0,k=0;        q=0;        for(i=0;a[i]!='\0';i++)        {            if(a[i]!=' ')                    d[j][k++]=a[i];            else                {                    d[j][k++]='\0';                    //puts(d[j]);                    k=0;                    j++;                }        }        d[j++][k++]='\0';        //printf("%d\n",j);        creatbitree(T,2,0);        travel(T);        printf("\n");    }}