スタック(プッシュとポップを使用)のおかげでツリーのバックトラッキングアルゴリズムを使用しています。 それは動作しますが、問題があります。スタックによって与えられたパスは「間違っている」。例えばツリーでバックトラッキングを使用する
bool Prefix(Node*root, stack *tas, char *search)
{
if (!isEmpty(root))
{
if (strcmp(search,root->data) != 0)
push(tas, root->data, search, root);
if (strcmp(search,root->data) == 0)
{
return True ;
}
Prefix(root->left, tas, search);
Prefix(root->right, tas, search);
}
return False;
}
、私は木を持っている:私は、たとえばCのパスをしたい場合は、この関数はR A B(OK RとA、いないB用)を返し
Root
/ \
A B
/\ /\
C D E F
。
この関数かpush()関数かどうかはわかりません。 関数にエラーが表示されない場合は、push()を貼り付けますが、かなり長いです。
編集:私は今理解しています 私は関数に追加しました:
ノードが葉の場合、pop()。 私がFを検索すると、R B Fの代わりにR A B Fが返されます。Aをスタックに入れないようにする方法は分かりません。
EDIT2:
ここコードです:多分 を追加し、私は良い結果を得るために横断子ノードを開くことができますどのように理解していない
bool Prefix(Node*root, stack *tas, char *search)
{
if (!isEmpty(root))
{
if (strcmp(search,root->data) == 0)
return True ;
if (LeafOrNot(root) == True){ //it's a leaf, pop()
pop(tas);
if (Prefix(root->left, tas, search))
return True;
if (Prefix(root->right, tas, search))
return True;
}
return False;
}
を(RBFのではなく、RABFを返します) a else if(接頭辞(root-> left、tas、search))?誰でもアイデアはありますか?
ありがとうございました!
あなたはほとんどあります。リーフノードだけでなく、子ノードを通過した後にスタックからポップすると、結果が得られます。ノードが見つかったらスタックをポップしないようにしてください。 Dを検索している場合は、ルートをプッシュし、Aを押し、Cを押し、Cをポップし、Dを押して、見つけます...コールチェーンを完全に巻き戻します。 F:ルートをプッシュし、Aを押し、Cを押し、Dを押す、Dをポップする、Aをポップする、Bを押す、Eを押す、Eをポップする、Fを押す、見つけた、巻き戻す... これが役立つことを願っています。 –
私は別のポップ(タス)を持っていることを試みましたが、動作しません。私はコードの構造を変更する必要がありますか?ありがとう – lilawood