Пролог рекурсивно найти самый большой узел

StackOverflow https://stackoverflow.com/questions/317740

  •  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).
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top