Пролог рекурсивно найти самый большой узел - PullRequest
0 голосов
/ 25 ноября 2008

Просто простое двоичное дерево, и я хочу найти самый большой узел.
дерево примеров: t (t (t (ноль, 1, ноль), 2, t (ноль, 3, ноль)), 4, t (t (т (ноль, 8, ноль), 5, ноль) , 6, т (ноль, 7, ноль))) * * +1002

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).

1 Ответ

2 голосов
/ 25 ноября 2008

Это еще одно домашнее задание ?

В любом случае, я постараюсь дать вам возможность подумать, поскольку вы, кажется, изучаете Пролог. Не говоря уже о том, что на моем компьютере фактически не работает Prolog, поэтому я не был уверен, что предложенное мной решение действительно сработает.

Тот факт, что 5 - единственный узел только с одним подузлом (т. Е. 8, который он игнорирует), должен вам кое-что сказать. Все остальные узлы являются либо конечными узлами, либо имеют два подузла.

Что именно вы думаете, что эти два правила делают?

tree(t(nil,Q,_),Q).
tree(t(_,Q,nil),Q).
...