Data structures 公式的后序遍历
在数据结构中,我将按顺序和预顺序公式转换为树。然而,我不太擅长邮购 对于给定的公式Data structures 公式的后序遍历,data-structures,tree-traversal,Data Structures,Tree Traversal,在数据结构中,我将按顺序和预顺序公式转换为树。然而,我不太擅长邮购 对于给定的公式xyz+ab-c*/- 我想出了 在大多数情况下,这似乎是合适的,除了左子树中的*是甲板上的小丑。在后序遍历中,最后一个字符是树的顶部节点,其他所有字符都向下分支。现在,我将/和*操作符理解为它们应该位于相反的节点上。然而,当遍历树时,除了*之外,其他都适合,因为左子树必须先到达根之前的节点,然后切换到右子树 正确的方向是值得赞赏的。实际上,编写一个解析后序表达式的程序要比按顺序解析的程序容易,因为您不必检查操作的
xyz+ab-c*/-
我想出了在大多数情况下,这似乎是合适的,除了左子树中的*是甲板上的小丑。在后序遍历中,最后一个字符是树的顶部节点,其他所有字符都向下分支。现在,我将/和*操作符理解为它们应该位于相反的节点上。然而,当遍历树时,除了*之外,其他都适合,因为左子树必须先到达根之前的节点,然后切换到右子树
正确的方向是值得赞赏的。实际上,编写一个解析后序表达式的程序要比按顺序解析的程序容易,因为您不必检查操作的优先级 尝试以下方法:制作一个堆栈,并在找到操作数时将其添加到堆栈中(从左到右)。找到一个操作时,从堆栈中提取所需的操作数,并放回一棵小树。完成后,堆栈中只有一个结果:最终图形 例:
按顺序去。首先,再次写出整个堆栈: x y z+ab-c*/- 现在,从左边开始,寻找第一个操作符。将它和堆栈中的前两个操作数替换为一点顺序位: x(y+z)ab-c*/- 继续下一个操作符: x(y+z)(a-b)c*/- 接下来: x(y+z)((a-b)*c)/- x((y+z)/(a-b)*c))- x-((y+z)/((a-b)*c))
现在,要使它成为一棵树,只需从中间开始(你已经知道它是原始堆栈中的最后一个元素),然后从外到内挂起括号中的子表达式。是的,我知道通过编程实现它会更容易,但这是教科书中的一个问题,很有可能在期中出现。在没有为解决方案编写代码的情况下,我不得不用老式的方式来做。谢谢,这个解决方案似乎是最合适的。我在x(y+z)((a-b)*c)之后迷路了,不知道如何放置最后两个操作符。
-
/ \
* / (divide)
/ \ / \
x + - c
/ \ /\
y z a b
x y z + -> x +
/ \
y z