2013-12-15 1 views
1

Я пытаюсь найти диапазоны в двоичном дереве поиска. но этот код возвращает false. Я не уверен, где проблема.Поиск по диапазону Prolog в дереве двоичного поиска возвращает false

mytree1(node(5, node(3, nil, nil), 
     node(8, node(7, nil, nil), 
      node(9, nil, nil)))). 


findExamsInRange(X,Y, T) :- find(X,Y,T). 
find(X,Y, node(X, _, _)). 
find(X,Y, node(N, L, _)) :- N > X, 
       between(X,Y,N), 
       find(X,Y,L), append(N, V). 
find(X, node(N, _, R)) :- N < X, 
       between(X,Y,N), 
       find(X,Y,R), append(N, V). 

ответ

1

эй там timimatic! findExamsInRange (X, Y, T): - найти (X, Y, T). Сначала это просто не нужно, так как оба findExamsInRange и find, похоже, имеют одинаковую цель. так зачем создавать новый предикат?

после прохождения кода ... я вижу, что вы добавляете выбранные узлы в список под названием «V». , но вы не передаете его в результате где-нибудь через ваш основной предикат (найти). есть также много вещей, которые вам нужно исправить ... вы не обрабатываете случаи, когда вы достигаете листа дерева и имеете узел с двумя нитями. у вас есть два разных случая: вы идете вправо, а другое вы идете влево ... но дело в том, что если ваш узел находится в диапазоне IN, вы должны идти вправо и влево. как насчет случаев, которые не удовлетворяют диапазону? вы должны подумать об этих и включить их ... или вы получите «ложную» информацию о том, что у них нет дела. find (X, Y, node (X, _, _)). эта строка кода бесполезна ... я предлагаю вам удалить ее. , поэтому для обертывания ... я думаю, что лучше всего добавить аргумент в свой предикат для передачи списка в (в начале), после чего вам нужно добавить некоторые случаи для случаев с nil, которые указывают на конец вашего дерево.

+0

Да, я применил точки, которые вы подняли ... но есть еще неправильно с алгоритмом itsef ... спасибо: D – timimatic

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