0

宿題ではなく、個人的なプロジェクトの一環として、私自身の興味とC ++の使用を開始するために、フィボナッチ値のバイナリツリーを作成しようとしています。私はここで多くの根本的な誤りを犯していることを知っていますが、誰かが私を助けてくれるなら、私のコードは以下のとおりです:

#include <iostream>
#include <typeinfo>
using namespace std;

class FibTree {

    class Node {
    public:
        Node const* left;
        Node const* right;
        int value;
        Node (int, Node*, Node*);
    };

    Node const* root;

public:
    FibTree (int);
    int getValue(){
        return this->root->value;
    };

private:
    static Node* buildTree(int n ) {
        if (n < 2) {
            return new Node( n, NULL, NULL );
        } else {
            Node* left = buildTree( n - 1 );
            Node* right = buildTree( n - 2 );
            return new Node( left->value + right->value , left, right );
        }
    }
};
FibTree::FibTree(int n) {
    this->root = buildTree(n);
};

FibTree::Node::Node(int value, Node* left, Node* right){
    this->value = value;
    this->left = left;
    this->right = right;
};

int main () {
    FibTree f(6);
    cout << f.getValue();
    return 0;
}

誰かが私がここで根本的に間違っていることを教えてもらえますか、重要なことに、割り当てで「FibTree」を「FibTree*」に変換できないというエラーが発生する理由を教えてください; どうすればもっとうまくアプローチできますか?

よろしくお願いします、アレックス

4

2 に答える 2

1

FibTreeエラーメッセージが示すように、ポインタに具象型を割り当てようとしています。多くの場合、エラーはポインターを使用していることですが、この場合、IDが重要です。FibTree値ごとに1つだけのインスタンスが必要です。

FibTreeあなたの目標は明らかに良い習慣を学ぶことなので、あなたが実装しているように見える抽象化はツリーの抽象化ではなく、ツリーのノードの抽象化であることを指摘することから始めます。個人的には、次のようなものから始めたでしょう。

class FibTree
{
    class Node
    {
        Node const* left;
        Node const* right;
        int value;
    };
    Node const* root;
public:
    //  ...
};

その後、それはあなたがどのようにツリーを構築したいかという個人的な好みの問題です。重要な点は、各ノードを動的に割り当てる必要があり(new Node(...)、だけでなく Node(...))、leftおよびrightポインタはすでにツリーに存在する要素である必要があるということです。

それ以外に、どれだけ教えてほしいかわかりません。残りの部分を理解することは興味深い学習体験になる可能性がありますが、より多くのヒットが必要な場合は、遠慮なく質問してください。この回答を編集して提供します。 。私が言うことの1つは、コンストラクターをに追加することNodeです。の線に沿った何か Node::Node( int value, Node* left, Node* right )。厳密に言えば、あなたはそれを必要とせず、とにかくアルゴリズムを変更することはありませんが、それはアルゴリズムをはるかに簡潔に書くことを可能にします。また、コンストラクターから呼び出される構造を構築するために再帰関数を使用します。そして最後に、ツリーレベルでデストラクタを追加します。これにより、ツリーが再帰的にウォークされ、すべてのノードが削除されます。

しかし、繰り返します。把握すべき最も重要な単一のポイントは、ノードがツリーではないということです。

于 2013-03-24T14:08:57.117 に答える
0
        this->left = FibTree(n - 1, this); // This line errors 'Cannot convert 'FibTree' to 'FibTree*' in assignment
        this->right = FibTree(n - 2, this); // This line errors 'Cannot convert 'FibTree' to 'FibTree*' in assignment

する必要があります

        this->left = new FibTree(n - 1, this);
        this->right = new FibTree(n - 2, this);

コンストラクターにrootを渡す理由はわかりませんが、コンストラクターでは何もしません。

于 2013-03-24T14:00:25.843 に答える