Пролог рекурсивно найти самый большой узел
-
11-07-2019 - |
Вопрос
Просто простое двоичное дерево, и я хочу найти самый большой узел. Пример дерева: t (t (t (ноль, 1, ноль), 2, t (ноль, 3, ноль)), 4, t (t (t (ноль, 8, ноль), 5, ноль) , 6, т (ноль, 7, ноль))) р>
int L(t,max) {
if(t=null) return max;
if(max<t.root) max = t.root;
LN(t,max);
RN(t,max);
return max;
}
L(tree,tree.root);
Я просто не могу обернуть голову, применяя ее к прологу. Здесь я отображаю каждый узел. Который я получаю, но я не понимаю, как сохранить максимальное значение и сохранить его рекурсивно.
tree(nil).
tree(t(L,Root,R)) :-
tree(L),
tree(R),
write(Root).
edit: проверяет все конечные узлы, но игнорирует t (nil, 8, nil)
tree(nil,0).
tree(t(nil,Q,nil),Q) :- !.
tree(t(nil,Q,_),Q).
tree(t(_,Q,nil),Q).
tree(t(L,_,R),Max) :-
tree(L, LValue),
tree(R, RValue),
max(LValue,RValue,Max).
Решение
Это еще одно домашнее задание ?
В любом случае, я постараюсь дать вам возможность подумать, поскольку вы, кажется, изучаете Пролог. Не говоря уже о том, что на моем компьютере фактически не работает Prolog, поэтому я не был уверен, что предложенное мной решение действительно сработает.
Тот факт, что 5 - единственный узел с единственным подузлом (т. е. 8, который он игнорирует), должен вам кое-что сказать. Все остальные узлы являются либо конечными узлами, либо имеют два подузла.
Что именно вы думаете, что эти два правила делают?
tree(t(nil,Q,_),Q).
tree(t(_,Q,nil),Q).