nil bintreenil R nil bintreeLeft Tree Root Rigth
Представяне на дърво nil bintree(nil, R, nil) bintree(Left. Tree, Root, Rigth. Tree)
member_tree(X, bintree(Left. Tree, R, Right. Tree)): ( X=R ; member_tree(X, Left. Tree) ; member_tree(X, Right. Tree)). leaf(X, bintree(nil, X, nil)). leaf(X, bintree(Left. Tree, Root, Right. Tree)): leaf(X, Left. Tree) ; leaf(X, Right. Tree). empty_tree(nil). % Селектори root(bintree(_, Root, _), Root). left_tree(bintree(LT, _, _), LT). right_tree(bintree(_, _, RT).
member_tree(X, T): ( root(T, R), X=R ; left_tree(T, LT), member_tree(X, LT) ; right_tree(T, RT), member_tree(X, RT)). leaf(X, T): left_tree(T, LT), empty_tree(LT), right_tree(T, RT), empty_tree(RT), root(T, R), X=R. leaf(X, T): ( left_tree(T, LT), leaf(X, LT) ; right_tree(T, RT), leaf(X, RT) ).
tree 2 list(nil, [ ]). tree 2 list(T, List): left_tree(T, LT), tree 2 list(LT, L 1), root(T, R), right_tree(T, RT), tree 2 list(RT, L 2), append(L 1, [R|L 2] , List).
leaves 2 list(nil, [ ]). leaves 2 list(T, [R] ): -leaf(T), root(T, R). leaves 2 list(T, List): left_tree(T, LT), leaves 2 list(LT, L 1), right_tree(T, RT), leaves 2 list(RT, L 2), append(L 1, L 2 , List).
depth_tree(T, 0): -empty_tree(T), !. depth_tree(T, D): left_tree(T, LT), depth_tree(LT, N 1), right_tree(T, RT), depth_tree(RT, N 2), ( N 1 < N 2, !, D is N 2+1 ; D is N 1+1).
Задача Предикат, който намира всички преки наследници на даден връх X в дадено дърво T. get_root(T, [R]): -root(T, R), !. get_root(T, [ ]). children(X, T, C): root(T, X), left_tree(T, LT), get_root(LT, RL), right_tree(T, RT), get_root(RT, RR), append(RL, RR, C). children(X, T, C): ( left_tree(T, LT), children(X, LT, C) ; right_tree(T, RT), children(X, RT, C)).
% Вариант 1 tree( t( t(nil, 7, nil), 4, t(nil, 2, nil)), 3 , nil ) , 5 , t(nil, 9 , t( t(nil, 8, nil), 1, t(nil, 6, nil)) ) ) ). % Селектори root(t(_, Root, _), Root). left_tree(t(LT, _, _), LT). right_tree(t(_, _, RT). ? -tree(T), way(5, 2, T).
% Вариант 2 tree( [ [nil, 7, nil], 4, [nil, 2, nil]], 3 , nil ] , 5 , [nil, 9 , [ [nil, 8, nil], 1, [nil, 6, nil]]]] ). % Селектори root([_, Root, _], Root). left_tree([LT, _, _], LT). right_tree([_, _, RT], RT). ? -tree(T), way(5, 2, T).
Задача Да се напише предикат, който да намира всички пътища от корен на дървото Т до негово листо. path(T, [ ] ): - empty_tree(T). path(T, [ R ] ): - root(T, R), left_tree(T, LT), empty_tree(LT), right_tree(T, RT), empty_tree(RT). path(T, [ R |Temp ] ): - root(T, R), left_tree(T, LT), path(LT, Temp). path(T, [ R |Temp ] ): - root(T, R), right_tree(T, RT), path(RT, Temp).
% [1, 2, 3, 4] -> 1234 list 2 number([], 0). list 2 number(L, N): append(Prev, [Last], L), list 2 number(Prev, Temp), N is Temp*10+Last.
% Втори начин max_num(T, X, 1): -root(T, X), left_tree(T, LT), empty_tree(LT), right_tree(T, RT), empty_tree(RT), !. max_num(T, N, K 1): -root(T, X), left_tree(T, LT), empty_tree(LT), right_tree(T, RT), max_num(RT, M, K), N is M + X*10**K, K 1 is K+1.
max_num(T, N, K 1): -root(T, X), right_tree(T, RT), empty_tree(RT), !, left_tree(T, LT), max_num(LT, M, K), N is M + X*10**K, K 1 is K+1. max_num(T, N, K 1): -root(T, X), left_tree(T, LT), max_num(LT, M, K), right_tree(T, RT), max_num(RT, U, W), (M>U, !, N is M + X*10**K, K 1 is K+1 ; N is U + X*10**W, K 1 is W+1).
Проверка дали дадено дърво е балансирано balanced_tree(T): -empty_tree(T). balanced_tree(T): left_tree(T, LT), depth_tree(LT, K), right_tree(T, RT), depth_tree(RT, M), abs(K-M) =< 1.
Основни операции Проверка дали дадено дърво е идеално балансирано perfect_tree(T): -empty_tree(T). perfect_tree(T): left_tree(T, LT), depth_tree(LT, K), right_tree(T, RT), depth_tree(RT, M), abs(K-M) =< 1, perfect_tree(LT), perfect_tree(RT).
Основни операции Построяване на двоично наредено дърво по зададен списък от числа gen_tree(List, Old. Tree, New. Tree) gen_tree([ ], T, T). gen_tree([X|L], nil, New. Tree): gen_tree(L, t(nil, X, nil), New. Tree). gen_tree([X|L], T, New. Tree): root(T, R), left_tree(T, LT), right_tree(T, RT), ( X < R, !, insert(X, LT, New. LT), gen_tree(L, t(New. LT, R, RT), New. Tree) ; insert(X, RT, New. RT), gen_tree(L, t(LT, R, New. RT), New. Tree) ).
Основни операции insert(X, nil, t(nil, X, nil)). insert(X, T, Result): root(T, R), left_tree(T, LT), right_tree(T, RT), (X>R, !, insert(X, RT, New. RT), Result= t(LT, R, New. RT) ; insert(X, LT, New. LT), Result= t(New. LT, R, RT) ).
- Slides: 27