在数据结构中,我将按顺序转换和预排序公式转换为树。不过,我不太擅长后期订购。
对于给定的公式x y z + a b - c * / -
我想出了
-
/ \
* / (divide)
/ \ / \
x + - c
/ \ /\
y z a b
在大多数情况下,这似乎很合适,除了左子树中的 * 是牌组中的小丑。在后序遍历中,最后一个字符是树的顶部节点,其他所有节点都向下分支。现在我使用 / 和 * 运算符来表示它们应该位于相反的节点上。然而,当遍历树时,除了 * 之外的所有内容都适合,因为左子树必须向上移动到根之前的节点,然后切换到右子树。
朝着正确方向的推动值得赞赏。
按顺序走。首先,再次写出整个堆栈:
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)) -
x - ((y + z) / ((a - b) * c))
现在,要使其成为一棵树,只需从中间开始(您已经知道它是原始堆栈中的最后一个元素),然后从外到内将带括号的子表达式挂在其中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)