Бинарное дерево - это просто структура данных. Я хотел бы представить его как что-то вроде tree(L,R,V)
, где
L
- левое поддерево, R
- правое поддерево, а V
- это значение этого узла.
Подчеркнув, как списки представлены в Прологе, мы можем использовать атом nil
для представления несуществующего поддерева, поэтому листовой узел будет выглядеть следующим образом: tree(nil,nil,123)
Итак, для дерева, которое выглядит следующим образом:
4
/ \
2 5
/ \ \
1 3 6
у вас будет такая структура Пролога:
tree(
tree(
tree(
.,
.,
1
),
tree(
.,
.,
2
),
3
),
tree(
.,
tree(
.,
.,
6
),
5
),
4
)
Тогда просто пройтись по Дерево, чтобы делать то, что вы хотите. Например,
sum( nil , 0 ).
sum( tree(L,R,V) , S ) :-
sum( L , SumL ),
sum( R , SumR ),
S is V + SumL + SumR
.
count( _, nil, 0 ).
count( X, tree(L,R,V), C) :-
count(X,L,Lefts),
count(X,R,Rights),
( X = V -> N = 1 ; N = 0 ) ,
C is N + Lefts + Rights.
Песочница находится в https://swish.swi-prolog.org/p/ncarey-binary-tree.pl