二進制樹可以在2個謂詞來定義:二叉樹在Prolog
emptyBT
,空二叉樹。BTTree(N,T1,T2)
這是真的,如果N
是左子樹T1
和右子樹T2
,其中T1
所有項目都小於或等於N
二進制樹的根,並在T2
所有的項目都超過N
更大。
編寫實現以下謂詞一個Prolog程序:
insert(I,T1,T2)
爲真,如果T2
是我插入二叉樹T1
產生的二叉樹。preorder(T,L)
如果L
是通過對二叉樹T
進行預先遍歷而生成的節點列表,則爲true。inorder(T,L)
如果L
是二叉樹T
的次序遍歷生成的節點列表,則爲true。postorder(T,L)
爲真,如果L
是二叉樹T
的後序遍歷生成的節點的列表。如果包含在二叉樹T
中,則爲真。如果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)).
我還沒看過prolog在相當一段時間很生鏽。你的答案是否有效?感謝您抽出寶貴時間來看看它。 – Danny