The Algorithm Design Manual中有两个相关的 excises 。
基本上,我知道如何解决第一个消费税,但我不知道如何使用第一个解决方案作为提示来解决第二个消费税。
算术表达式树的消费税
上面是一个算术表达式树。假设算术表达式以树的形式给出。每个叶子都是一个整数,每个内部节点都是标准算术运算之一(+,-,*,/)。例如,表达式 2 + 3 * 4 + (3 * 4)/5 由上图中的树表示。给出一个计算这样一个表达式的 O(n) 算法,其中树中有 n 个节点。
好的,这并不难。我的解决方案是这样的:
public float evaluate() {
return evaluate(root);
}
private float evaluate(Node_EX _node) {
if (_node.left == null || _node.right == null)
return Float.parseFloat(_node.key);
String op = _node.key;
if (op == "+") {
return evaluate(_node.left) + evaluate(_node.right);
} else if (op == "-") {
return evaluate(_node.left) - evaluate(_node.right);
} else if (op == "*") {
return evaluate(_node.left) * evaluate(_node.right);
} else {
return evaluate(_node.left) / evaluate(_node.right);
}
}
我只是使用递归的方式来解决表达式树的结果。
算术表达式DAG的 Excise
假设一个算术表达式被给出为一个 DAG(有向无环图),其中删除了公共子表达式。每个叶子都是一个整数,每个内部节点都是标准算术运算之一(+,-,*,/)。例如,表达式 2 + 3 * 4 + (3 * 4)/5 由上图中的 DAG 表示。给出一个 O(n + m) 算法来评估这样一个 DAG,其中 DAG 中有 n 个节点和 m 个边。提示:修改树案例的算法以达到所需的效率。
好的,描述中有这样一个提示:提示:针对树的情况修改一个算法,以达到预期的效率。
实际上,我对这个提示感到很困惑。对于一个典型的树相关的事情,我们通常可以使用递归来解决。但是,如果这是一个图,我的第一个直觉是使用 BFS 或 DFS 来解决它。那么我如何将 BFS 或 DFS 与树相关联,尽管 DFS 实际上是递归的?