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