2008-11-25 61 views
0

只是一個簡單的二叉樹,我想找到最大的節點。 (t(t(nil,1,nil),2,t(nil,3,nil)),4,t(t(t(nil,8,nil),5,nil) 6,t(nil,7,nil)))prolog遞歸發現最大節點

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

編輯:它檢查所有的葉節點,但忽略了T(零,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 2008-12-04 04:21:21

回答

2

這是another homework assignment

無論如何,我會盡量讓你做這個想法,因爲你似乎在學習Prolog。更不用說事實上我沒有在我的電腦上運行Prolog,所以我不能確定我的建議解決方案是否真的有效。

5是唯一有一個子節點的節點(即它忽略的8)應該告訴你一些事實。所有其他節點都是葉節點或有兩個子節點。

你認爲這兩條規則到底是什麼?

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

嘿,我改變了我在想的方式,我只是遍歷了樹並創建了一個列表,而不是從列表中找到了最大的數字,並完成了。但我認爲這是錯誤的方法。根據我認爲的序言/遞歸,我很難想到。 – chicken 2008-11-26 00:10:43