📜  门| GATE-CS-2017(套装1)|问题 33(1)

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

问题33 - 表达式树求值

这道题是关于如何使用表达式树求值的问题。给出了一个表达式树,需要我们对其进行求值并返回结果。

我们可以把表达式树看作是由操作数和操作符组成的树形结构。根据树结构的特点,我们可以使用递归的方式对表达式树进行求值。对于根节点,我们将其左右子树对应的子表达式递归求值,并根据根节点的操作符计算出当前子表达式的值。

代码实现上,我们需要定义一个递归函数 evaluate_expression_tree,用于计算以当前节点为根的子表达式的值。在函数内部,我们首先检查当前节点的类型。若是操作数节点,则直接返回其保存的值。若是操作符节点,则递归求出左右子树对应的值,并根据当前节点的操作符计算得到最终的结果。

下面是具体的代码实现。我们先定义一个节点类 ExpressionNode,用于表示表达式树中的节点。每个节点会有一个类型和对应的值,分别保存在属性 typevalue 中。若是操作数节点,type 的值为 "operand"value 存储这个操作数;若是操作符节点,type 的值为 "operator"value 存储这个操作符。

class ExpressionNode:
    def __init__(self, type, value):
        self.type = type
        self.value = value
        self.left = None
        self.right = None

接下来是求值函数 evaluate_expression_tree,其输入为一个表达式树的根节点作为参数,输出为根节点对应表达式的计算结果。我们在函数内部做了如下处理:

  • 若当前节点为操作数节点,直接返回它的值;
  • 若当前节点为操作符节点,递归求出左右子树的值,并根据当前节点的操作符计算出最终结果。
def evaluate_expression_tree(root):
    if root.type == "operand":
        return root.value
    else:
        left_val = evaluate_expression_tree(root.left)
        right_val = evaluate_expression_tree(root.right)
        if root.value == "+":
            return left_val + right_val
        elif root.value == "-":
            return left_val - right_val
        elif root.value == "*":
            return left_val * right_val
        else:
            return left_val / right_val

这样,我们就实现了一个计算表达式树的函数。下面是一个测试案例,用于验证我们的求值函数的正确性。

# 测试表达式树: 2 * (3 + 4) - 5
root = ExpressionNode("operator", "-")
root.left = ExpressionNode("operator", "*")
root.left.left = ExpressionNode("operand", 2)
root.left.right = ExpressionNode("operator", "+")
root.left.right.left = ExpressionNode("operand", 3)
root.left.right.right = ExpressionNode("operand", 4)
root.right = ExpressionNode("operand", 5)

# 计算表达式树
result = evaluate_expression_tree(root)

# 验证结果是否正确
assert result == 9

在这个测试案例中,我们定义了表达式树 2 * (3 + 4) - 5,并通过调用求值函数 evaluate_expression_tree 计算出了表达式的值。最后,我们使用断言语句验证了计算的结果是否正确,确保程序的正确性。

以上就是这道门户题目的解答过程,希望能对各位程序员有所帮助。