私はすべての段階で現在のノードを取得するインオーダートラバーサルを実装しようとしています。 例えば:Prologを使ったバイナリツリーインオーダートラバーサル
?- getnodesinorder(tree(1,nil,nil),X).
X = 1 ;
false.
?- getnodesinorder(tree(5,tree(4,tree(1,nil,tree(3,tree(2,nil,nil),nil)),nil),tree(6,nil,nil)),X).
X = 1 ;
X = 2 ;
X = 3 ;
X = 4 ;
X = 5 ;
X = 6 ;
false.
私は次のコードを試してみた:
getnodesinorder(tree(CurrentNode,nil,nil), CurrentNode).
getnodesinorder(tree(X, Left, nil), CurrentNode) :-
getnodesinorder(Left, _),
CurrentNode is X.
getnodesinorder(tree(X, nil, Right), CurrentNode) :-
CurrentNode is X,
getnodesinorder(Right, _).
getnodesinorder(tree(X, Left, Right), CurrentNode) :-
getnodesinorder(Left, _),
CurrentNode is X,
getnodesinorder(Right, _).
ベース(第一の例では動作します)もちろんそうするが、第二いずれかを実行しようとしたとき、私は
X=5;
false
を取得します結果として
となります。何故ですか?
わかりましたが、(編集された上記参照)ということでしたが、今、私はちょうどX = 5を取得し、偽
は、ここでは、インオーダートラバースを行う方法です何らかの理由から。 – user550413
私のサンプルを試してみてください。常にトレースを使用することを忘れないでください。 –
はい、リストを使用しています。あなたのコードでは、Xはあなたが構築するリストであり、最終的にあなたはinorderのトラバーサルのリストを持っています。私は別のものが欲しい。私はXをすべての正しい値を取得する変数にします。この例のように、「;」と入力すると、次のX(インオーダーシーケンスの次の番号)を取得したい。 – user550413