作为个人项目的一部分,而不是家庭作业 - 仅仅为了我自己的兴趣并开始使用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 *';以及我应该如何更好地接近?
先谢谢, 亚历
答案 0 :(得分:1)
正如错误消息所示,您正在尝试分配具体内容
键入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 )
。有点像
{{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传递给构造函数,但是你没有对它做任何事情。