我们应该如何构造以下“前缀”顺序表达式的二叉树?
( - * / 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,一团糟。
答案 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中的下一个元素”也删除了已经处理过的部分。
如果输入正确,它将如下工作:
示例:
* + 5 1 7
将导致:
Expr(Expr(Leave(5), Leave(1), "+"), Leave(7), "*")
请注意,这些前缀表达式无法查看“ - ”是否应该是一元否定或二进制减法。因此,您不能使用相同的运算符字符。
答案 1 :(得分:-2)
请在此处查看最后两个答案。
parsing math expression in c/c++
我认为它们非常有用。
你需要一个正式的语法,然后是一个递归的下降解析器。 不确定你是否完全熟悉这两个概念。 如果没有,你应该阅读更多关于它们的信息。