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
)。在计算树时,如果找到带有变量的树节点,则在树外部的其他结构中查找变量的实际值。