二叉树 表达式树的值 .


题目描述
读入表达式树的先序遍历字符串,求其值。运算符只可能是加减乘除,保证输入的每个子表达式树的结果都是整数值且可以用C语言的int类型表达。


输入
输入由多组测试数据组成。


每组数据包含一行字符串,即表达式树的先序遍历序列,字符串长度大于0且不超过100。


输出
见样例。
样例输入
+ 13 # # * 5 # # 9 # #
* + 13 # # 5 # # 9 # #
样例输出
(13+(5*9))=58

((13+5)*9)=162

思路:照着题目模拟,值得关注的是对输入字符时候的处理,刚开始我是输入了一行然后再提取,容易答案错误还有运行错误,参考同学代码发现他的处理实在巧妙,可以当做字符性质的二叉树的模板

#include <cstdio> 
#include <cstring> 
using namespace std; 
#define OK 1 
#define ERROR 0 
typedef struct
{ 
    int num;    //存储整形数字
    char ch;    //存储运算符号
} ElemType; 
typedef struct BiTNode 
{ 
    ElemType data; 
    struct BiTNode *lchild,*rchild; 
} BiTNode,*BiTree; 
  
void InitBiTree(BiTree &T) 
{ 
    char s[10]; 
    cin>>s;  //巧妙的处理同时避免了多个空格的尴尬
    if (s[0]=='#') T=NULL; 
    else
    { 
        T=new BiTNode; 
        if (s[0]=='+'||s[0]=='-'||s[0]=='*'||s[0]=='/') 
            T->data.ch=s[0]; 
        else
        { 
           int n=0; 
            for (int i=0; i<strlen(s); i++) 
              n=n*10+(s[i]-'0'); 
            T->data.num=n;   //字符的数字转化为整形
        } 
        InitBiTree(T->lchild); 
        InitBiTree(T->rchild); 
    } 
} 
//遍历运算并输出表达式
int Travel(BiTree T) 
{ 
    int re; 
    if (T->lchild==NULL&&T->rchild==NULL){ 
        printf("%d",T->data.num); 
       re=T->data.num; 
    } 
    else
    { 
  
        printf("("); 
        int num1=Travel(T->lchild); 
        printf("%c",T->data.ch); 
        int num2=Travel(T->rchild); 
        printf(")"); 
         switch (T->data.ch){ 
        case '+':re=num1+num2; break; 
        case '-':re=num1-num2; break; 
        case '*':re=num1*num2; break; 
        case '/':re=num1/num2; break; 
  
       } 
    } 
    return re; 
} 
int main() 
{ 
    BiTree T; 
    char c[10]; 
    while (cin>>c) 
    { 
        if (c[0]=='#')  //根节点是否为空
            T=NULL; 
        else
        { 
            //初始化二叉树
            T=new BiTNode; 
            if (c[0]=='+'||c[0]=='-'||c[0]=='*'||c[0]=='/') 
                T->data.ch=c[0]; 
            else
            { 
                int n=0; 
                for (int i=0; i<strlen(c); i++) n=n*10+(c[i]-'0'); 
                T->data.num=n; 
            }   
            InitBiTree(T->lchild); 
            InitBiTree(T->rchild); 
        } 
        //遍历得出结果
        int re=Travel(T); 
        printf("=%d\n",re); 
    } 
    return 0; 
} 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值