📜  门| GATE CS 2021 |设置 1 |问题 21(1)

📅  最后修改于: 2023-12-03 15:28:38.912000             🧑  作者: Mango

门| GATE CS 2021 |设置 1 |问题 21

本题目主要考察二叉树的遍历和构建。在本题中,我们需要实现从给定的中缀表达式字符串中构建出一棵二叉树,并完成二叉树的后序遍历,最终输出结果。

问题描述

我们可以将中缀表达式转化为二叉树表示。具体的,我们使用下面的规则从中缀表达式字符串构建一棵二叉树:

  1. 数字将作为叶节点插入到树中;
  2. 运算符将作为非叶子节点插入到树中,并将其左右子树分别设置为它作为根节点时对应的运算对象。

例如,对于中缀表达式 "1+2*3",我们可以将其转化为二叉树表示:

      +
     / \
    1   *
       / \
      2   3

然后我们需要输出该二叉树的后序遍历结果。例如,对于上述树,其后序遍历结果为 "1 2 3 * +"。

请你完成程序实现,根据输入的中缀表达式,输出对应的后序遍历结果。

输入格式

输入共一行,为一个字符串,表示输入的中缀表达式。输入的中缀表达式仅包含以下内容:

  1. 数字如 "0"-"9";
  2. 运算符:加号 "+",减号 "-",乘号 "*",除号 "/";
  3. 括号:左括号 "(" 和右括号 ")"。

输入字符串中的除号 "/" 表示实数除法,即对应的运算结果一般为实数。除法运算符输出为小数点后四位有效数字的实数,其余运算符均为整数运算。输入字符串表达式保证合法,不同元素之间均以一个空格隔开。

输出格式

输出共一行,为一个字符串,表示根据输入的中缀表达式构建的二叉树的后序遍历结果。输出字符串中间间隔一个空格。

输入样例
2 + 3 * 4
输出样例
2 3 4 * +
注意事项

在本题目中,我们可以考虑使用函数递归来实现二叉树的构建和遍历。

其中,构建二叉树的具体算法大致如下:

  1. 定义两个栈:运算符栈和节点栈。初始时,运算符栈为空,节点栈顶容器一个空节点;
  2. 从左到右,对于表达式中的每个元素,依次执行以下过程:
    • 如果该元素是一个数字,那么将该元素转化为一个节点,添加到节点栈中;
    • 如果该元素是一个左括号,那么将一个空节点作为其左儿子,将该空节点压入节点栈中,并将该空节点作为新的根;
    • 如果该元素是一个右括号,那么直接将栈中的根弹出;
    • 如果该元素是一个运算符,那么将其插入运算符栈,并将一个空节点作为其左儿子,将该空节点压入节点栈中,并将该空节点作为新的根。
  3. 当表达式处理结束后,节点栈顶部的元素即为根节点。

在定义了二叉树之后,我们可以使用递归的方式来实现二叉树的后序遍历。对于一个节点,我们可以递归输出其左右子树的后序遍历结果,然后将该节点的值加入到结果中即可。

具体的代码实现如下: