[英]Calculator Algorithm - Using Iteration instead of Recursion on Binary Search Tree
我已经了解了如何遍历二叉树并找到所有节点的总和的方法,除了我正在评估计算器的表达式输入。 节点根据操作顺序以适当的顺序排列,并且节点可以是operators
也可以是operators
operands
。 我认为recursion
比迭代慢,因此我想弄清楚如何遍历二叉树并找到不recursion
输入的表达式的结果。
树的示例:
+
* /
3 4 4 2
到目前为止,我有一个递归方法(我为运算符使用了一个枚举):
public static float evaluate(BETNode root)
{
if (root == null)
{
throw new IllegalArgumentException("Error: Root is null!");
}
if (root.getType() == BETNodeType.OPERAND)
{
return root.getOperand();
}
float leftValue = evaluate(root.getLeft());
float rightValue = evaluate(root.getRight());
switch (root.getOperator())
{
case '+':
return leftValue + rightValue;
case '-':
return leftValue - rightValue;
case '*':
return leftValue * rightValue;
case '/':
return leftValue/rightValue;
}
throw new IllegalArgumentException("Error.");
}
正如我在上面的评论中提到的那样,如果您进行了迭代的后遍历遍历 ,则将按以下顺序获得节点:
3, 4, *, 4, 2, /, +.
由此,您只需要一个堆栈即可计算表达式。
Push 3
Push 4
Push (pop() * pop())
Push 4
Push 2
Push (pop() / pop())
Push (pop() + pop())
//Result
有趣的还有Shunting Yard算法 ,它可以根据中缀表达式进行评估。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.