2017-41

104 阅读2分钟

【2017统考真题】41 请设计一个算法,将给定的表达式树(二叉树)转换为等价的中缀表达式 (通过括号反映操作符的计算次序)并输出。例如,当下列两棵表达式树作为算法的输入时:

image.png 输出的等价中缀表达式分别为(a+b)(c(-d))和(a*b)+(-(c-d))。 二叉树结点定义如下:
image.png 要求: 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;
}