2

スタックオーバーフローで質問するのは初めてでした。よくある質問を読んだだけで、ルールに違反していることがわかりました。質問に対処して貼り付けるだけではありませんでした。インオーダートラバースメソッドを使用して再帰を実行し、ノードが5の倍数であるかどうかを確認しましたが、次に何をすべきかわかりません。何かをチェックするためにフラグを使用する必要がありますか?

void findNodes(BSTNode<Key,E> *root) const
{
    if(root==NULL) return;
    else
    {
        if(root->key()%5==0)//I know it's wrong, but I don't know what to do
        {
            findNodes(root->left());
            cout<<root->key()<<" ";
            findNodes(root->right());
        }
        else
        {
            findNodes(root->left());
            findNodes(root->right());
        }

    }
}
4

4 に答える 4

1

祖父母が5の倍数であるノードの印刷は、ツリーを「上に」見上げる必要があるため、複雑です。ツリーを下るだけでよいので、5の倍数であるすべてのノードを見つけて孫を印刷するので、問題を見ると簡単です。

void printGrandChildren(BSTNode<Key,E> *root,int level) const{
    if(!root) return;
    if(level == 2){
         cout<<root->key()<<" ";
         return;


    }else{
        printGrandChildren(root->left(),level+1);
        printGrandChildren(root->right(),level+1);

     }

}

次に、findNodesを次のように変更します

void findNodes(BSTNode<Key,E> *root) const
{
    if(root==NULL) return;
    else
    {
        if(root->key()%5==0)
        {
            printGrandChildren(root,0);
        }
        else
        {
            findNodes(root->left());
            findNodes(root->right());
        }

    }
}
于 2012-11-30T02:25:04.073 に答える
0

これを試して:

int arr[height_of_the_tree]; //arr[10000000] if needed;

void findNodes(BSTNode<Key,E> *root,int level) const {
  if(root==NULL) return;
  arr[level] = root -> key();
  findNodes(root -> left(), level + 1);
  if(2 <= level && arr[level - 2] % 5 == 0) cout << root->key() << " ";
  findNodes(root -> right(), level + 1);
}

int main() {
  ...
  findNodes(Binary_search_tree -> root,0);
  ...
}
于 2012-11-30T02:16:09.127 に答える
0

5の倍数のキーを持つ祖先を持つすべての子ノードを出力しようとしている場合、1つの方法は、boolこのファクトを格納するfindNodes関数にを渡すことです。

次のようなもの:

void findNodes(BSTNode<Key,E>* node, bool ancesterIsMultOf5) const
{
    if (node)
    {
        if (ancesterIsMultOf5)
            std::cout << node->key() << std::endl;

        ancesterIsMultOf5 |= (node->key() % 5 == 0); 

        findNodes(node->left(), ancesterIsMultOf5);            
        findNodes(node->right(), ancesterIsMultOf5);            
    }
} 

あるいは、ツリーを描画しようとしている場合は、以前に回答されています。Cバイナリツリーをコンソールに「描画」する方法

于 2012-11-30T02:21:02.107 に答える
0

次のものを置き換えます

    cout<<root->key()<<" ";

    if(root->left)
    {
        if(root->left->left)
            cout<<root->left->left->key()<< " ";
        if(root->left->right)
            cout<<root->left->right->key()<< " ";
    }
    if(root->right)
    {
        if(root->right->left)
            cout<<root->right->left->key()<< " ";
        if(root->right->right)
            cout<<root->right->right->key()<< " ";

    }
于 2012-11-30T02:24:38.120 に答える