表达式树的值
时间限制: 1 Sec
内存限制: 128 MB
题目描述
读入表达式树的先序遍历字符串,求其值。运算符只可能是加减乘除,保证输入的每个子表达式树的结果都是整数值且可以用C语言的int类型表达。
输入
输入由多组测试数据组成。
每组数据包含一行字符串,即表达式树的先序遍历序列,字符串长度大于0且不超过100。
输出
见样例。
样例输入
+ 13 # # * 5 # # 9 # #
* + 13 # # 5 # # 9 # #
样例输出
(13+(5*9))=58
((13+5)*9)=162
解题思路
本题的主要难点在于输出括号和二叉树值的运算
AC代码
#include <bits/stdc++.h>
using namespace std;
typedef struct T
{
char data[4];
struct T *rchild,*lchild;
} BiTNode,*BiTree;
char a[100][3]; //模拟树的每层的字符
int depth = 0;
int isopchar(char c)
{
switch(c)
{
case '+':return 1;
case '-':return 2;
case '*':return 3;
case '/':return 4;
}
return false;
}
void ini_T(BiTree &T)
{
T = new BiTNode;
T->lchild = NULL;
T->rchild = NULL;
}
void Create_T(BiTree &t)
{
if(a[depth][0] == '#')
{
t = NULL;
depth++; //当一个结点为空时意味着该结点的父节点创建成功,深度+1
}
else
{
t = new BiTNode;
strcpy(t->data,a[depth++]);
Create_T(t->lchild);
Create_T(t->rchild);
}
}
void Trave(BiTree t) //由树的结构可以看出,父节点为运算符,父节点的左右子树为需要运算的数
{
if(t)
{
if(isopchar(t->data[0]))
{
cout << '('; //遇到运算符(父节点)就要加括号
Trave(t->lchild); //先遍历输出左子树
cout << t->data ; //输出运算符
Trave(t->rchild); //遍历输出右子树
cout << ')';
}
else
cout << t->data ;
}
}
int calculate(BiTree t)
{int i,num = 0;char c[16];
if(t)
{
switch(isopchar(t->data[0]))
{ //遇到运算符要将其左右子树进行对应的运算
case 1:return calculate(t->lchild) + calculate(t->rchild);
case 2:return calculate(t->lchild) - calculate(t->rchild);
case 3:return calculate(t->lchild) * calculate(t->rchild);
case 4:return calculate(t->lchild) / calculate(t->rchild);
case 0: //如果不是运算符就计算当前结点的整数值并返回
strcpy(c,t->data);
for(i = 0; c[i] ; ++i)
num = num*10 + c[i]-'0';
return num;
}
}
}
int main()
{
char b[1000];
while(gets(b) != NULL)
{
BiTree T;
ini_T(T);
int i, p = 0,q = 0;
for(i = 0 ; b[i] ; ++i)
{
if(b[i] != ' ')
a[p][q++] = b[i];
else //遇到空格时,该结点创建完毕
{
a[p++][q] = '\0'; //p++ 移到下一个结点
q = 0;
}
}
a[p++][q++] = '\0';
Create_T( T );
Trave( T );
cout << '=' << calculate(T)<<endl;
depth = 0;
}
return 0;
}