Binary Tree In Prolog
Binäre Baum definiert werden können, in Bezug auf die 2 Prädikate:
emptyBT
, der leere binäre Baum.BTTree(N,T1,T2)
das ist wahr, wennN
ist die Wurzel eines binären Baumes mit linkem TeilbaumT1
und rechten TeilbaumT2
, wo alle Elemente inT1
sind weniger als oder gleichN
und alle Elemente inT2
sind größer alsN
.
Schreiben Sie ein Prolog-Programm implementiert, dass die folgenden Prädikate:
insert(I,T1,T2)
ist wahr, wennT2
ist die binäre Struktur, die aus, die ich eingefügt in binärer BaumT1
.preorder(T,L)
ist wahr, wennL
ist eine Liste von Knoten erzeugt, indem eine preorder-Traversierung des binären BaumsT
.inorder(T,L)
ist wahr, wennL
ist eine Liste von Knoten erzeugt, die durch eine inorder-Traversierung des binären BaumsT
.postorder(T,L)
ist wahr, wennL
ist eine Liste von Knoten erzeugt, die durch eine postorder-Traversierung des binären BaumsT
.search(T,I)
ist wahr, wennI
enthalten ist, in den binären BaumT
.height(T,H)
ist wahr, wennH
ist die Höhe des binären BaumesT
. Ein leerer Baum hat die Höhe0
und ein Baum mit einem Element hat die Höhe1
.
Hier mein code bisher: ich habe keine Ahnung, ob sein Recht, jede Hilfe oder Hinweise würde
sehr geschätzt werden!
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)).
InformationsquelleAutor Danny | 2013-07-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nur um klar sein, ich denke, dass dein code nicht funktionieren kann, und nicht zeigen jede nützliche coding-Praxis. Dann habe ich umgesetzt in einem kompakten notation, wo
-
es den leeren Baum, und ein Baum istt(LeftSubtree, Int, RightSubtree)
. Wie erforderlich, alle ints in LeftSubtree sind weniger als Int, etc...inl/3 es ist ein Dienstprogramm, fügen Sie alle ints in einen Baum und 'zurück' das Ergebnis.
Einige test:
InformationsquelleAutor CapelliC