【发布时间】:2020-06-04 19:35:59
【问题描述】:
【问题讨论】:
标签: data-structures tree logic
【问题讨论】:
标签: data-structures tree logic
我预计这将是一个很长的答案,因为我将通过总体思考过程来实现解决方案。对于住院病人来说,解决方案在最后。
你的解决方案正确吗?
嗯,这取决于。如果∨ 优先于∧,则您的图片将完全正确,在这种情况下,您只需在(b < c) ∨ (c < d) 有结果后应用∧。如果你像这样使用括号强制优先级也是正确的:
(a < b) ∧ ( (b < c) ∨ (c < d) )
也就是说,在谈论operator precedence 时,通常∧/and 优先于∨/or。当优先级相同时,计算从左到右进行,即右侧取决于左侧的结果。
运算符的优先级越高,它在树中出现的越低。
答案的其余部分将假定通常的运算符优先级。
如何解决这个问题?
解决这类问题的最佳方法是分解表达式。更好的是,如果我们使用prefix/polish notation 进行分解,那么以后构建树会更自然。
给定:(a < b) ∧ (b < c) ∨ (c < d)
让我们把它分解成几部分:
x = (a < b), which translates to prefix: < a b
y = (b < c), which translates to prefix: < b c
z = (c < d), which translates to prefix: < c d
我们现在有 3 个不等式表达式,分解为 x、y 和 z。
现在是逻辑运算符。
i = x ∧ y, which translates to prefix: ∧ x y
j = i ∨ z, which translates to prefix: ∨ i z
我们现在有 2 个逻辑表达式分解为 i 和 j。请注意它们如何依赖于x、y、z。而且,j 依赖于i。依赖关系很重要,因为您知道树叶没有依赖关系。
如何构建树?
总结一下,这就是我们从原始表达式中分解出来的:
x = < a b
y = < b c
z = < c d
i = ∧ x y
j = ∨ i z
让我们自下而上地处理它。
考虑到依赖关系,叶子显然是最独立的元素:a、b、c 和d。
让我们构建树的底部,考虑这些独立元素在我们刚刚进行的分解中的所有出现(b 和 c 出现两次,我们放了两次)。
a b b c c d
现在让我们构建 x、y 和 z,它们仅依赖于 a、b、c 和 d。我将使用 / 和 \ 来构建我的 ASCII 艺术作品,就像你的图片行一样。
x y z
< < <
/ \ / \ / \
a b b c c d
现在我们已经看到,i 仅依赖于 x 和 y。所以我们现在可以把它放在那里。我们现在还不能添加j,因为我们需要先添加i。
i
∧
/ \
x y z
< < <
/ \ / \ / \
a b b c c d
现在我们只是缺少j,这取决于i 和z。
j
∨
/ \
/ \
i \
∧ \
/ \ \
x y z
< < <
/ \ / \ / \
a b b c c d
我们有一个完整的表达式树。如您所见,每个依赖级别都会产生一个树级别。
为了完全准确,这棵树中的Breadth-First Search 必须考虑z 与i 处于同一级别,因此树的正确表示必须将z 高一级:
j
∨
/ \
/ \
i z
∧ <
/ \ / \
x y c d
< <
/ \ / \
a b b c
再说明一点,为了完全清楚,对于表达式(a < b) ∧ ( (b < c) ∨ (c < d) ),分解结果将是:
x = < a b
y = < b c
z = < c d
j = ∨ y z
i = ∧ x j
这反过来会导致你图片中的树。
希望这对您未来构建表达式树的努力有所帮助。
【讨论】:
123、"foo")或对变量的引用(a、b)。在评估树时,如果找到带有变量的树节点,则在树外部的某个其他结构中查找变量的实际值。