prolog - 检查结构是否是带有序言的二叉树
问题描述
使用结构:
tree(tip).
tree(bin(L,_,R)) :- tree(L), tree(R).
如何确定一棵树是否是一棵二叉树,左边的每个节点都比右边的每个节点都小?
到目前为止,我所拥有的是:
bst(tip).
bst(tip, _, _).
bst(bin(bin(L, Ln, R), N, tip)):- N > Ln -> bst(bin(L, Ln, R)).
bst(bin(bin(L, Ln, R), N, bin(L, Rn, R))):- (
N > Ln -> bst(bin(L, Ln, R)); false,
N < Rn -> bst(bin(L, Rn, R)); false
).
解决方案
我觉得你把这弄得太复杂了。我们可以在这里定义一个谓词来检查带有null
值的间隔,以检查(无)有界的间隔。例如:
check(null, X) :-
!.
check(X, null) :-
!.
check(X, Y) :-
X < Y.
接下来我们可以创建一个谓词,该谓词最初传递两个null
s 作为边界:
bst(Tree) :-
bst(Tree, null, null).
现在我们可以实现bst/3
谓词 where 对于每个bin/3
复合词,我们检查值是否在范围内,然后递归地检查值作为新边界:
bst(tip, _, _).
bst(bin(L, V1, R), V0, V2) :-
check(V0, V1),
check(V1, V2),
bst(L, V0, V1),
bst(R, V1, V2).
推荐阅读
- java - 如何使用 CodeQL 检查 Java 注释是否具有特定属性?
- javascript - p5 在不需要的 html 页面中加载
- java - 如何为 application.properties 设置服务器名称、登录名和密码?
- java - LinkedBlockingQueue 与 take() 多次
- arrays - 一次增加两个数组元素,使它们都等于最大值
- machine-learning - 使用多项式基函数进行回归时,小批量梯度下降不起作用
- javascript - FastAPI返回Json Array,需要转成表格
- opencv - OpenCV VideoCapture 无法打开文件,如何确定原因?
- try-catch - Solidity try catch 显示 Etherscan 上内部 tx 的执行已恢复
- c++ - 在 ubuntu 上将默认 c++ 库从 std=c++14 切换到 std=c++17