我创建了一个表达式的二叉树,并将运算符(+, - ,/,*)作为根和操作数(值)作为子项左/右。我需要在二叉树中使用参数(T,v)来评估该表达式,其中' T'是二叉树和' v'是一个后序遍历开始的节点。
我搜索了后期遍历的工作方式以及我理解的所有内容。但我不知道如何使用节点来实现代码' v'对于后序遍历。
我的方法看起来像这样......
public int evaluateExpression (LinkedBinaryTree<T> tree, Position<T> v) {
}
这应该返回在其运算符(根的子节点)上使用的运算符。所以,我明白该怎么做,我坚持如何实际做到这一点。 -.-
答案 0 :(得分:2)
您不需要提供整棵树,也不需要单独的Position
课程。每个子树都是一棵树。你只需要这样的东西:
public class <T extends Number> ExpressionTree<T> {
private ExpressionTree<T> left, right;
private T value;
private int operator;
// constructors, getters, setters, etc. elided
public T evaluateExpression() {
// Here I am assuming a <T> value field that is set if the node
// is a literal value rather than an expression subtree with left and right children.
if (this.value != null)
return this.value;
// Evaluate the subtree
switch (this.operator) {
case '+':
return left.evaluateExpression()+right.evaluateExpression();
// etc for the other operators
}
}
您不应使用以下评论中提到的LinkedBinaryTree
课程。它不是以任何方式为此目的而设计的,并且在我看来即使出于自己的目的也是不必要的复杂。
答案 1 :(得分:0)
通常情况下,在现实世界中,你会像EJP建议的那样这样做。
那就是说,一个后序迭代器会以正确的顺序给你存储在树中的值和运算符基本上这样做:
遍历后,返回堆栈中唯一的元素