1

単純な二分木だけで、最大のノードを見つけたいです。
ツリーの例: t(t(t(nil,1,nil),2,t(nil,3,nil)),4,t(t(t(nil,8,nil),5,nil),6, t(nil,7,nil)))

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

1 に答える 1

2

これは別の宿題ですか?

いずれにせよ、あなたはプロローグを学んでいるように見えるので、私はあなたに考えさせようとします。私が実際に私のコンピューターでPrologを実行していないという事実は言うまでもなく、私は提案された解決策が実際に機能するかどうか確信が持てませんでした。

5がサブノードが1つしかない唯一のノード(つまり、8が無視されている)であるという事実は、何かを教えてくれるはずです。他のすべてのノードはリーフノードであるか、2つのサブノードがあります。

これらの2つのルールが行うとあなたが思うのは正確には何ですか?

tree(t(nil,Q,_),Q).
tree(t(_,Q,nil),Q).
于 2008-11-25T20:56:58.720 に答える