【发布时间】:2016-01-04 21:06:04
【问题描述】:
我尝试在 Prolog 中编写一个谓词来查找树的高度。
我的树是这样表示的:
A
/ \
B C
/ \ / \
D E F G
[a,[b,[d,e],c[f,g]]] ([Root,[Children]])
我的谓词是:
height(Tr,0) :-
atomic(Tr).
height([L|R],N) :-
height(L,N1),
height(R,N2),
N is max(N1,N2)+1.
但我的代码不起作用。当我写:
height([a,[b,[d,e],c,[f,g]]],N).
N 等于 8。
我可以帮忙吗?
注意:根的高度从 0 开始。
【问题讨论】:
-
不适用于哪个维度?
-
您的树表示看起来不一致,并且您拥有的代码不会匹配有效的树(无论它看起来像什么 - 很难分辨它是什么)。例如,
[c,e,f]看起来不像基于您的图片的有效子树。如果这不是您的树的样子,请展示您测试的实际树并解释您的意思,代码不起作用。 -
我认为,首先,您需要定义一致的树表示。
[a,[b,d],[c,e,f]](3 个元素的列表)不能完全描述您所描绘的树,并且与您给出的[Root, [Children]](2 个元素的列表)的一般模式不匹配。一旦有了一致的表示,代码就会变得简单明了。 -
对不起,我犯了一个错误......现在我有一个一致的树表示,但高度不好:/
-
您的新树表示仍然不一致。如果
[a,[b,[d,e],c,[f,g]]]是二叉树,那么内部列表[b, [d,e], c, [f,g]]的元素太多。表示应该有一个清晰的头部,左,右结构,然后谓词可以遵循该结构。现在,您的谓词有[L|R],其中L是列表head,R是tail(列表的其余部分),它没有t 似乎是对的。人们会期望在实现中左右对称。
标签: tree prolog height binary-tree