2008-11-25 7 views
0

Простое двоичное дерево, и я хочу найти самый большой узел.
Пример дерева: t (t (t (nil, 1, nil), 2, t (nil, 3, nil)), 4, t (t (t (nil, 8, nil), 5, nil) 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). 

редактировать: Он проверяет все узлы листьев, но игнорирует т (ноль, 8, ноль)

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

Я заметил, что в комментарии ниже вы поняли это. Было бы здорово, если бы вы могли ответить на свой вопрос здесь. – Rich

ответ

2

Является ли это another homework assignment?

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

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

Что именно вы думаете об этих двух правилах?

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

Эй, я изменил способ, о котором думал, я просто пересек дерево и создал список, чем я нашел наибольшее число из списка и сделал. Но я думаю, что здесь неправильный подход. Мне сложно думать о прологе/рекурсии, я думаю. – chicken

+0

На самом деле мышление сложнее, я решил его без использования списка :). – chicken

+0

Отлично ... Это требует времени, чтобы привыкнуть. Я не пользовался Prolog годами, поэтому для меня это тоже неплохо. :) Не просто ли удаление этих двух правил, о которых я упомянул из вашего существующего кода, также решил? Возможно, мне придется установить Prolog сейчас ... – mercator

 Смежные вопросы

  • Нет связанных вопросов^_^