在java中创建给定前缀表示法的二进制表达式树

时间:2013-11-23 23:25:48

标签: java recursion binary-tree

我们应该如何构造以下“前缀”顺序表达式的二叉树?

( - * / 8 + 5 1 4 + 3 - 5/18 6) 4

伪代码是这样的:

public ExpressionRootNode MakeBinaryTree(expr):
    element = next element in expr
    if element is a number:
        return a leaf node of that number
    else: // element is an operator
        left = MakeBinaryTree(expr)
        right = MakeBinaryTree(expr)
        return a binary tree with subtrees left and right and with operator element
        //^aka return root

但是,我不太明白如何递归调用函数来创建所述树。 我曾尝试查看如何 Create a binary tree from an algebraic expression,但无法弄清楚如何回溯到其他节点。

项目文件:http://pastebin.com/BJiPtDM5,一团糟。

2 个答案:

答案 0 :(得分:1)

更多伪代码:

abstract class Tree { .... }
class Leave extends Tree { int number; ... }
class Expr  extends Tree { Tree left, right; String operation;  .... }

public Tree makeBinaryTree(expr):
   element = next element in expr
   if element is a number:
      return new Leave(element)
   else: // element is an operator
      left = makeBinaryTree(expr)
      right = makeBinaryTree(expr)
   return new Expr(left, right, element)

Leave / Expr的构造函数应该只是从它们的参数中设置字段。

但仍有待完成的是一些错误处理。哦,并确保“expr中的下一个元素”也删除了已经处理过的部分。

如果输入正确,它将如下工作:

  • 如果输入只是一个数字,它将返回一个带有该数字的假期
  • 如果输入的格式为OP L R,它将记住OP,从L生成左子树,从R生成右子树,并将其作为表达式返回。
  • 没有其他输入可能/有效

示例:

* + 5 1 7

将导致:

Expr(Expr(Leave(5), Leave(1), "+"), Leave(7), "*")

请注意,这些前缀表达式无法查看“ - ”是否应该是一元否定或二进制减法。因此,您不能使用相同的运算符字符。

答案 1 :(得分:-2)

请在此处查看最后两个答案。

parsing math expression in c/c++

我认为它们非常有用。

你需要一个正式的语法,然后是一个递归的下降解析器。 不确定你是否完全熟悉这两个概念。 如果没有,你应该阅读更多关于它们的信息。