Не знаю ничего о Visual Prolog, но в обычном Прологе я бы сделал что-то вроде следующего ...
Во-первых, я бы обозначил пустое дерево как атом btree
и представлял бы не- пустое btree как структура арности 3, таким образом:
btree( Payload, LeftChildren, RightChildren )
, где Payload
- данные для узла (очевидно, целое число), с LeftChildren
и RightChildren
, представляющими btrees,соответственно левый и правый дочерние узлы текущего узла.
Обход дерева для подсчета этих узлов с четными узлами прост.Открытый предикат имеет арность 2, принимая структуру [bound] btree, которую нужно исследовать, и привязанное или несвязанное значение, представляющее количество четных элементов.Он вызывает внутренний рекурсивный предикат-помощник, который обходит дерево и вырабатывает счет.
count_even( T , N ) :- count_even( T , 0 , N ) .
Внутренний предикат также прост.Имея арность 3, первый аргумент - это дерево, которое нужно исследовать, второй - накопитель, а третий - окончательный счет (который не будет объединен до самого конца).Есть два возможных случая.
Если дерево пустое, у нас есть окончательный счет:
count_even( btree , N , N ) .
Если дерево не-empty, мы исследуем текущий узел, затем рекурсивно обходим левые и правые дочерние деревья, таким образом:
count_even( btree( V , L , R ) , T , N ) :-
is_even( V , X ) ,
T1 is T+X ,
count_even( L , T1 , T2 ) ,
count_even( R , T2 , N )
.
Нам также нужен тривиальный помощник, чтобы сказать нам, является ли конкретное значениечетное или нечетное:
is_even( V , 1 ) :- 0 is V mod 2 , ! .
is_even( V , 0 ) .
Следует отметить, что используемая вами структура данных не является b-деревом, per se : это двоичное дерево .
B-деревья представляют собой обобщение двоичного дерева с сбалансированной высотой, оптимизированного для хранения на диске.Каждый узел имеет переменное количество ключей и переменное количество дочерних элементов (соответствующее количеству ключей).Для получения дополнительной информации см.
Вот изображение B-дерево:
и изображение двоичного дерева: