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指针。在许多情况下,错误在于您使用的是指针,但在这种情况下,身份很重要。您需要一个,并且每个值只有一个实例FibTree

由于您的目标显然是学习良好实践,因此我将首先指出您似乎正在实现的抽象FibTree不是树的抽象,而是树中节点的抽象。就个人而言,我会从以下内容开始:

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

在那之后,更多的是个人喜好的问题,你想如何建立树;重要的一点是每个节点都必须是动态分配的(new Node(...),而不仅仅是 Node(...)),并且leftright指针必须是树中已经存在的元素。

除此之外,我不确定您希望我告诉您多少,解决其余部分可能是一种有趣的学习体验,但是如果您想要更多点击,请随时询问,我将编辑此答案以提供他们. 我要说的一件事:我会在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 回答