2013-12-15 91 views
1

我正在嘗試搜索二叉搜索樹中的範圍。但是這段代碼返回false。我不確定問題出在哪裏。二進制搜索樹中的序列範圍搜索返回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

hey there timimatic! findExamsInRange(X,Y,T): - find(X,Y,T)。 首先這個是沒有必要的,因爲findExamsInRange和find都有相同的目標。那麼爲什麼要創建一個新的謂詞呢?

經過您的代碼後...我看到您將選定的節點追加到名爲「V」的列表中。 但是你並沒有通過你的主要謂詞(find)將結果作爲結果傳遞給它。 還有很多事情你需要解決......你並不是在處理你到達樹的一片葉子並且有一個帶有兩個節點的節點的情況。 你有兩種不同的情況,一種是你正確的,另一種是你要離開的......但事實上,如果你的節點在範圍內,你應該去左右兩邊。 不滿足範圍的情況如何?你應該考慮這些幷包括他們......否則你會因爲沒有爲他們提供案件而得到「虛假」的信息。 find(X,Y,node(X,_,_))。 這行代碼是無用的...我建議你刪除它。 所以結束......我認爲最好是,如果你添加一個參數到你的謂詞來傳遞列表(作爲一個開始),然後你需要添加一些case爲零的情況,表明你的結束樹。

+0

是的,我應用了你提出的觀點......但是這個算法有更多的錯誤itsef ......謝謝:D – timimatic