转载自:https://mp.weixin.qq.com/s/PSxuA0LmzuLhokc3p15V5Q
二叉树不是空的,它是由一个根元素和两个后继者组成,它们本身又是二叉树。
在Prolog中,我们用原子“ nil”表示空树,用项 t(X,L,R) 表示非空树,其中X表示根节点,L和R分别表示左子树和右子树。因此,相应示例树由以下Prolog项表示:
T1 = t(a,t(b,t(d,nil,nil),t(e,nil,nil)),t(c,nil,t(f,t(g,nil,nil),nil)))
其他示例是仅由根节点组成的二叉树:
T2 = t(a,nil,nil)或空的二叉树:T3 = nil
1、检查给定项是否表示二叉树
编写谓词istree / 1,当且仅当其参数是代表二叉树的Prolog项时,该谓词才会成功。
istree(T) :- T是代表二叉树的项
istree(nil).
istree(t(_,L,R)) :-
istree(L), %检测左树
istree(R). %检测右树
测试:
?- consult('p4_01.pl').
true.
?- istree(t(a,t(b,t(d,nil,nil),t(e,nil,nil)),t(c,nil,t(f,t(g,nil,nil),nil)))).
true.
2、构造完全平衡的二叉树
在完全平衡的二叉树中,每个节点都具有以下属性:左子树中的节点数和右子树中的节点数几乎相等,这意味着它们的差不大于1。
编写谓词cbal_tree/2以为给定数量的节点构造完全平衡的二叉树。谓词应通过回溯生成所有解。将字母“ x”作为信息放入树的所有节点中。
1 cbal_tree(0,nil) :- !.
2 cbal_tree(N,t(x,L,R)) :-
3 N > 0,
4 N0 is N - 1,
5 N1 is N0//2,
6 N2 is N0 - N1,
7 distrib(N1,N2,NL,NR),
8 cbal_tree(NL,L),
9 cbal_tree(NR,R).
10 %以下三个事实在问题5中的investigate/2谓词中深入体会一下fail的操作
11 distrib(N