Fibonacci序列的递归二叉树类

时间:2013-03-24 13:50:35

标签: c++ data-structures recursion binary-tree fibonacci

作为个人项目的一部分,而不是家庭作业 - 仅仅为了我自己的兴趣并开始使用C ++,我正在尝试创建一个Fibonacci值的二叉树; 我知道我在这里犯了许多有趣的错误,但如果有人可以帮助我,我会很感激,我的代码如下:

#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 *';以及我应该如何更好地接近?

先谢谢, 亚历

2 个答案:

答案 0 :(得分: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 )。有点像 {{1}}。严格 说来,你不需要它,它不会改变算法 无论如何,它会使算法编写得更多 简洁。另外,我使用递归函数来构建 结构,从构造函数调用。最后,我要添加一个 树级别的析构函数,递归地遍历树 删除所有节点。

但我再说一遍:要掌握的最重要的一点就是a 节点不是树。

答案 1 :(得分: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传递给构造函数,但是你没有对它做任何事情。