繁体   English   中英

计算器算法-在二叉搜索树上使用迭代而不是递归

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM