Data structures 逻辑表达式的表达式树

Data structures 逻辑表达式的表达式树,data-structures,tree,logic,Data Structures,Tree,Logic,我需要转换这个:(a

我需要转换这个:
(a
表达式转换为表达式树,但我无法找到一种看起来正确的方法。以下是我得到的:


我预测这将是一个很长的答案,因为我将经历实现解决方案的一般思考过程。对于住院患者来说,解决方案就在最后

您的解决方案正确吗?

那要看情况了。如果
优先于
,在这种情况下,您需要应用
仅在
之后(b
有结果。如果使用括号强制优先,也可以这样做:

(a
也就是说,当谈论时,通常是
∧/并且
优先于
∨/或
。当优先级相同时,计算从左向右进行,这意味着右侧取决于左侧的结果

运算符的优先级越高,在树中显示的优先级越低

答案的其余部分将采用通常的运算符优先级

如何解决这个问题?

解决这类问题的最佳方法是分解表达式。更好的是,如果我们使用分解,它将更自然地建立树以后

给定:
(a

让我们将其分解为几个部分:

x=(a
我们现在有3个不等式表达式分解为
x
y
z

现在是逻辑运算符

i=x∧ y、 转换为前缀:∧ xy
j=i∨ z、 转换为前缀:∨ 伊兹
我们现在有两个逻辑表达式分解为
i
j
。注意它们是如何依赖于
x
y
z
。但是,
j
取决于
i
。依赖关系很重要,因为你知道树叶没有依赖关系

如何构建树?

总之,这是我们从原始表达式分解的内容:

x=
让我们从下往上接近它

考虑到相关性,叶子显然是最独立的元素:
a
b
c
d

让我们构建树的底部,考虑我们刚才进行的分解中这些独立元素的所有外观(
b
c
出现两次,我们放置两次)

a b c d
现在让我们构建只依赖于
a
b
c
d
x
y
z
。我将使用
/
\
来构建与您的图片线等效的ASCII艺术

xyz
<       <       <
/ \     / \     / \
a、b、c、d
现在我们已经看到,
i
只依赖于x和y。所以我们现在可以把它放在那里。我们现在还不能添加
j
,因为我们需要
i
首先到达那里

i
∧
/   \
x y z
<       <       <
/ \     / \     / \
a、b、c、d
现在我们只是缺少了
j
,这取决于
i
z

j
∨
/   \      
/     \
我\
∧         \
/     \       \
x y z
<       <       <
/ \     / \     / \
a、b、c、d
我们有一个完整的表达式树。如您所见,每个依赖项级别都将产生一个树级别

完全正确,A在这个树中必须考虑<代码> z < /C> >与<代码> i < /C> >相同,所以树的正确表示必须放在代码> z < /代码>一级以上:

j
∨
/     \      
/       \
伊兹
∧          <
/     \      / \
x y c d
<       <       
/ \     / \     
a、b、c
为了完全清楚起见,只需再加一个注释,用于表达式
(a
,分解结果为:

x=
这反过来又会导致图片中的树


希望这有助于您将来构建表达式树。

感谢您的深入解释,这对我帮助很大。只有一件事,昨天我问我的导师是否可以在树中多次使用同一个变量,他没有真正的答案,告诉我不要这样做。我想不出一个不使用b和c两次的方法,那么他是错了还是我遗漏了什么?简短的回答是肯定的。但是变量和树节点之间有区别。构建树时,不能在两个父节点之间共享树节点,这将使其成为图形而不是树。这并没有说明叶树节点包含的内容。叶树节点可以保存例如值(
123
“foo”
)或对变量的引用(
A
b
)。在计算树时,如果找到带有变量的树节点,则在树外部的其他结构中查找变量的实际值。