Я изучаю Пролог и пытаюсь найти глубину двоичного дерева с помощью Пролога. Я представляю такое дерево:
nil is a tree.
tree(1,nil,nil) this is a leaf.
tree(1,tree(1,nil,nil),nil) this is a tree with root 1 and has a left leaf 1.
Мне нужен предикат глубины для этой глубины (T, N), который будет истинным, если N - глубина дерева T. Я предполагаю, что я буду использовать предикат глубины, когда T не является переменной, но N может быть переменной. Примеры:
?- depth(nil,N).
N = 0.
?- depth(tree(1,tree(2,nil,tree(3,nil,nil)),tree(5,tree(6,nil,nil),nil)),N).
N = 3.
?- depth(tree(1,nil,tree(2,nil,nil)),N).
N = 2.
Я не уверен, как это сделать, чтобы N было максимумом между двумя поддеревьями.
Спасибо за любую помощь.
Решение:
depth(nil,0).
depth(tree(_,nil,nil),1).
depth(tree(_,Left,Right), D) :-
depth(Left,DLeft),
depth(Right,DRight),
D is max(DLeft, DRight) + 1.