【2017统考真题】41 请设计一个算法,将给定的表达式树(二叉树)转换为等价的中缀表达式 (通过括号反映操作符的计算次序)并输出。例如,当下列两棵表达式树作为算法的输入时:
输出的等价中缀表达式分别为(a+b)(c(-d))和(a*b)+(-(c-d))。
二叉树结点定义如下:
要求:
1)给出算法的基本设计思想。
2)根据设计思想,采用C或C++语言描述算法,关键之处给出注释。
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
/*
【2017统考真题】41
请设计一个算法,将给定的表达式树(二叉树)转换为等价的中缀表达式
(通过括号反映操作符的计算次序)并输出。例如,当下列两棵表达式树作为算法的输入时:
输出的等价中缀表达式分别为(a+b)*(c*(-d))和(a*b)+(-(c-d))。
二叉树结点定义如下:
typedef struct node
{
char data[10];
struct node *left, *right;
} BTree;
要求:
1)给出算法的基本设计思想。
2)根据设计思想,采用C或C++语言描述算法,关键之处给出注释。
*/
typedef struct node
{
char data[10];
struct node *left, *right;
node(const char *val) : left(nullptr), right(nullptr)
{
strcpy(data, val);
}
} BTree;
string bfs(BTree *root)
{
if (!root)
return "";
if (!root->left && !root->right)
return root->data;
return "(" + bfs(root->left) + root->data + bfs(root->right) + ")";
}
string ExpressTree(BTree *root)
{
return bfs(root->left) + root->data + bfs(root->right);
}
int main()
{
// 构造表达式树 (a + b) * (c * (-d))
BTree *root = new BTree("*"); // 根节点为乘法
// 左子树 (a + b)
root->left = new BTree("+");
root->left->left = new BTree("a");
root->left->right = new BTree("b");
// 右子树 (c * (-d))
root->right = new BTree("*");
root->right->left = new BTree("c");
root->right->right = new BTree("-");
root->right->right->right = new BTree("d"); // -d 的左子树
// 将表达式树转换为中缀表达式
string infixExpression = ExpressTree(root);
cout << "中缀表达式: " << infixExpression << endl;
// 清理内存
delete root->left->left;
delete root->left->right;
delete root->left;
delete root->right->left;
delete root->right->right->left;
delete root->right->right;
delete root->right;
delete root;
return 0;
}