【问题标题】:Creating a Binary Expression Tree given prefix notation in java在java中创建一个给定前缀符号的二进制表达式树
【发布时间】:2013-11-23 23:25:48
【问题描述】:

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

( - * / 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,一团糟。

【问题讨论】:

  • 退货怎么样?并非所有方法都必须是 void 你知道的。
  • 编辑伪代码以从 void -> ExpressionRootNode 更改
  • 好!你有操作,左子树和右子树。创建相应的 Tree 实例到底有什么问题?
  • 函数不需要用它的父根调用自己吗?它如何知道谁在左边,谁在右边? this.left 和 this.right 会起作用吗?

标签: java recursion binary-tree


【解决方案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 中的下一个元素”也删除了已经处理过的部分。

如果输入正确,它将像这样工作:

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

例子:

* + 5 1 7

将导致:

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

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

【讨论】:

  • 这不考虑设置根节点。它将创建一个具有左右孩子的空根。根将是空白的。
  • pastebin.com/izcuMTuZ 这是我从你的代码中得到的。我正在尝试创建一个 ExpressionTree。我是否只是在 ExpressionTree 的构造函数中调用 makeBinaryTree,然后将 (ExpressionTree) 转换为 makeBinaryTree 的结果?
  • 我想我设法得到它。我需要做的就是弄清楚如何将这棵 Expr 的树变成一整棵 ExpressionTree。
  • pastebin.com/s1RxYN7x ... 也很奇怪,我不能调用 root.data i.imgur.com/g62a064.png
  • @jakeinmn 是的,它创建了一棵树,就是这样。如果您需要设置一些变量(根节点?),您可以在调用它的方法中执行此操作。我不确定你对 ExpressionTree 的意思是什么?请说明你对它的定义。该代码被认为可以适应您的数据结构。
【解决方案2】:

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

parsing math expression in c/c++

我认为它们非常有用。

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

【讨论】:

  • 抱歉,他不需要递归下降解析器。
  • 好的...可能是。也许只是一个堆栈? :)
  • 他的伪代码已经不错了。他只是对参数传递有点困惑。
猜你喜欢
  • 1970-01-01
  • 2019-04-26
  • 1970-01-01
  • 2014-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-04
  • 1970-01-01
相关资源
最近更新 更多