作为个人项目的一部分,而不是家庭作业-只是出于我自己的兴趣和开始使用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*'在分配;我该如何更好地接近你?
提前感谢亚历克斯
正如错误消息所示,您正在尝试分配一个具体的输入FibTree
到指针。在许多情况下,错误是您正在使用指针,但在这种情况下,同一性很重要。对于每个值,您只需要一个FibTree
实例。
既然你的目标显然是学习好的实践,我也会首先指出你似乎是抽象的FibTree
中实现的不是树的,而是节点的在树上。就我个人而言,我会从一些事情开始如:
class FibTree
{
class Node
{
Node const* left;
Node const* right;
int value;
};
Node const* root;
public:
// ...
};
在那之后,更多的是个人喜好的问题想要筑起大树;重要的一点是,每个节点必须动态分配(new Node(...)
,而不仅仅是Node(...)
),并且left
和right
指针必须是
除此之外,我不确定你想让我告诉你多少,解决剩下的问题可能是一个有趣的学习过程经验,但如果你想要更多的点击,请随时提问,还有我将编辑这个答案来提供它们。我想说的是:我会添加一个构造函数到Node
。类似于Node::Node( int value, Node* left, Node* right )
。严格说来说去,你不需要它,它也不会改变算法不管怎样,它会让写算法变得更加简洁。同样,我将使用递归函数来构建结构,从构造函数调用。最后加上a树级的析构函数,它递归遍历树删除所有节点
但是我重复一遍:最重要的一点是要把握节点不是树
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);
不知道为什么要把根传递给构造函数,但是你没有对它做任何事情。