-1

このツリーにファイルを追加しようとすると、ツリーのルートの子としてのみ追加されます。比較演算子は正しくオーバーロードされています (テスト済み)。

誰かが私のコードに明らかに問題があるのを見ることができますか?

template <typename Item>
void BTtree<Item>::addNode(const Item& newItem)
{
    BTnode<Item> *newNode = new BTnode<Item>(newItem);
    insert(newNode, root_ptr);
}   

template <typename Item>
void BTtree<Item>::insert(BTnode<Item> *newNode, BTnode<Item> *root)
{               
    if(root == NULL)
    {
        root = newNode;
        std::cout << "Flight added: ";
        std::cout << *root << std::endl;
        return;
    }
    else
    {
        if(newNode < root )
        {
            std::cout << "Adding "<<*newNode<< " left child of " << *root << std::endl;
            insert(newNode, root->left() );
        }
        else
        {
            std::cout << "Adding "<<*newNode<<" right child of " << *root << std::endl;
            insert(newNode, root->right());
        }
    }
}

編集:オーバーロードされた演算子のコードを提供する

template <typename Item>
bool BTnode<Item>::operator < (const BTnode<Item>& other)
{
    return ( *data < other.data );
}

そして、私が使用しているオブジェクトについて

const bool Flight::operator < (const Flight& other) const
{
return ( (arrivalTimeHours < other.arrivalTimeHours) || 
         (arrivalTimeHours == other.arrivalTimeHours &&
          arrivalTimeMinutes < other.arrivalTimeMinutes)
);
4

1 に答える 1

1

の場合、割り当てが呼び出し元に影響を与えないためroot->left() == NULL、その後insert(newNode, root->left() )も条件root->left() == NULLが保持されます。root = newNode

あなたの署名

void BTtree<Item>::insert(BTnode<Item> *newNode, BTnode<Item> *root)

参照渡しではありません。値渡しです。値がたまたまポインター型になっているだけです。

次のアプローチをお勧めします。

  • 再帰をBTnodeクラスに移動します
  • 再帰関数はconst Item&を引数として取ります
  • 再帰関数が存在しない分岐に入る必要がある場合、BTnodeからを作成しItem、適切なメンバー変数を新しく作成された に設定しますBTnode
  • BTnodeのデストラクタが両方の子を破棄することを確認してください。
  • コピーを禁止するか、適切なコピー コンストラクターとコピー代入演算子を記述します ( Rule of Threeを参照)。
于 2013-10-20T11:23:33.290 に答える