二分木は、次の 2 つの述語で定義できます。
emptyBT
、空の二分木。BTTree(N,T1,T2)
が左サブツリーと右サブツリーN
を持つバイナリ ツリーのルートであり、 のすべての項目が より小さいか等しく、 のすべての項目が より大きい場合、これは真です。T1
T2
T1
N
T2
N
次の述語を実装する Prolog プログラムを作成します。
insert(I,T1,T2)
T2
が二分木に挿入された結果の二分木である場合は真ですT1
。preorder(T,L)
L
がバイナリ ツリーの事前順トラバーサルによって生成されたノードのリストである場合は true ですT
。inorder(T,L)
L
がバイナリ ツリーの順序どおりのトラバーサルによって生成されたノードのリストである場合は true ですT
。postorder(T,L)
L
がバイナリ ツリーのポストオーダー トラバーサルによって生成されたノードのリストである場合は true ですT
。search(T,I)
I
がバイナリ ツリーに含まれている場合は true ですT
。height(T,H)
H
がバイナリ ツリーの高さである場合は true ですT
。空のツリーには height が0
あり、アイテムが 1つあるツリーには height があり1
ます。
これまでの私のコードは次のとおりです。その権利が正しいかどうかはわかりません。ヘルプやポインターをいただければ幸いです。
isempty(nil) :- !.
isempty(tree(nil,nil,nil)).
bTTree(tree(_,nil,nil)).
bTTree(tree(N,Left,nil)) :- Left@=<N.
bTTree(tree(N,nil,Right)) :- N@<Right.
bTTree(tree(_,Left,Right)) :- bTTree(Left), bTTree(Right).
bTTree(tree(N,Left,Right)) :- Left@=<N, N@<Right.
%traversals.
%preorder -- N,Left,Right
preorder(t,L) :- bTTree(t),
bTTree(t(N,Left,Right)),
append(N,[Left|Right],L).
preorder(t,L) :- bTTree(t(_,Left,_),
preorder(Left,L).
preorder(t,L) :- bTTree(t(_,_,Right),
preorder(Right,L).
%inorder -- Left,N,Right.
inorder(t,L) :- bTTree(t),
bTTree(t(N,Left,Right)),
append(Left,[N|Right],L).
inorder(t,L) :- bTTree(t(N,_,_)), inorder(N,L).
inorder(t,L) :- bTTree(t(_,_,Right)), inorder(Right,L).
%postorder -- Left,Right,N
postorder(t,L) :- bTTree(t),
bTTree(t(N,Left,Right)),
append(Left,[Right|N],L).
postorder(t,L) :- bTTree(t(_,_,Right)),
inorder(Right,L).
postorder(t,L) :- bTTree(t(N,_,_)),
append(_,[_|N],L).
search(t,I) :- bTTree(t(I,_,_)). %searches each node for I
search(t,I) :- bTTree(t(_,I,_)).
search(t,I) :- bTTree(t(_,_,I)).
search(t,I) :- bTTree(t(_,N,_)), search(N,I).%recursive method to search left branch for I
search(t,I) :- bTTree(t(_,_,N)), search(N,I).%recursive " " " right branch for I
height(t,H) :- bTTree(t(nil,nil,nil)), H is 0. %height of empty tree is 0
height(t,H) :- bTTree(t(_,nil,nil)), H is 1. %height of single node Btree is 1
height(t,H) :-
bTTree(t(_,Left,Right)), %otherwise height of bTree is the max
height(Left, H1), %height of left or right branch plus 1
height(Right, H2),
H is max(H1,H2) + 1.
insert(I,t1,t2) :-
bTTree(t1(X,L,_)),
bTTree(t2(X,L,I)).
insert(I,t1,t2) :-
bTTree(t1(nil,nil,nil)),
bTTree(t2(I,nil,nil)).
insert(I,t1,t2) :-
bTTree(t1(X,L,_)),
bTTree(t2(X,L,I)).