问题描述:
一个算术表达式的计算语义可以用二叉树唯一的表示出来。假设算术表达式的语义二叉树已经给出,请编码实现算术表达式的中缀形式(保持计算语义)的输出,并计算出该表达式的值。
要求:
1)使用二叉树的完全前序序列建立表达式的语义二叉树,空子树用符号@表示;
2)算术运算符包括:+, -, *, / ; 运算量只考虑单数字字符(1位整数)
3 ) 输出时用括号该表优先级;
提示:
1)递归执行下列步骤即可求值:先分别求出左子树和右子树表示的子表达式的值,最后根据根结点的运算符的要求,计算出表达式的最后结果。
2)二叉树的中序遍历序列与原算术表达式基本相同,但是需要将中序序列加上括号,即当根结点运算符优先级高于左子树(或右子树)根结点运算符时,就需要加括号。
例如:
输入:2@@-3@@1@@
输出:2(3-1)=4
例如:
输入 | Result |
---|---|
*2@@-3@@1@@ | 2*(3-1)=4 |
+/-*+3@@2@@6@@8@@2@@/-9@@3@@3@@ | ((3+2)*6-8)/2+(9-3)/3=13 |
答案:
#include <iostream>
#include <algorithm>
#include <queue>
#include <stdio.h>
using namespace std;
typedef struct BinTreeNode{
struct BinTreeNode *leftChild,*rightChild;
char data;
}BNode,*BTree;
void CreateBinTree1(BTree &subTree){
char item;
cin>>item;
if(item!='@') {
subTree = new BNode();
subTree->data = item;
CreateBinTree1(subTree->leftChild);
CreateBinTree1(subTree->rightChild);
}
else subTree = NULL;
}
double Sum(BTree subTree){
if(subTree!=NULL){
if(subTree->leftChild!=NULL&&subTree->rightChild!=NULL){
if(subTree->leftChild->data <='9'&&subTree->leftChild->data >='0'){
if(subTree->rightChild-></