Бинарное дерево может быть определено в терминах 2 предикатами:Binary Tree В Прологе
emptyBT
, пустое бинарное дерево.BTTree(N,T1,T2)
, что является истинным, еслиN
является корнем бинарного дерева с левого поддереваT1
и правого поддереваT2
, где все элементыT1
меньше или равнаN
и все элементыT2
больше, чемN
,
Напишите программу на Прологе, которая реализует следующие предикаты:
insert(I,T1,T2)
верно, еслиT2
является бинарное дерево, в результате я вставляется в бинарное деревоT1
.preorder(T,L)
верно, еслиL
список узлов, порожденных обходе двоичного дереваT
.inorder(T,L)
имеет значение true, еслиL
- это список узлов, сгенерированных обходным путем по двоичному деревуT
.postorder(T,L)
имеет значение true, еслиL
- это список узлов, сгенерированных последующим обходом двоичного дереваT
.search(T,I)
имеет значение true, еслиI
содержится в двоичном деревеT
.height(T,H)
имеет значение true, еслиH
является высотой двоичного дереваT
. Пустое дерево имеет высоту0
и дерево с одним предметом имеет высоту1
.
Вот мой код до сих пор: я понятия не имею, если его право, любая помощь или указатели будут весьма признателен!
isempty(nil) :- !.
isempty(tree(nil,nil,nil)).
bTTree(tree(_,nil,nil)).
bTTree(tree(N,Left,nil)) :- [email protected]=<N.
bTTree(tree(N,nil,Right)) :- [email protected]<Right.
bTTree(tree(_,Left,Right)) :- bTTree(Left), bTTree(Right).
bTTree(tree(N,Left,Right)) :- [email protected]=<N, [email protected]<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)).
Я не смотрел прологи в течение долгого времени очень ржавыми. Работает ли ваш ответ? Спасибо, что нашли время посмотреть на это. – Danny