我有一个二叉树,其节点定义为
typedef unsigned long ul;
struct Fibonacci_node{
ul number;
int n;
bool isLeaf;
Fibonacci_node * left;
Fibonacci_node * right;
};
我想在每次插入时设置isLeaf
,这样我最终可以很容易地得到叶子的总数。插入方法由公共方法 insert 组成,它调用私有递归方法 insertR 。
#include <iostream>
using namespace std;
class Fibonacci_tree{
private:
struct Fibonacci_node{
ul number; // store the n-th fibonacci number
int n; // fibonacci number to compute
bool isLeaf; // true if the node is leaf
Fibonacci_node * left;
Fibonacci_node * right;
};
/* definition of the root of the binary tree */
Fibonacci_node * root;
/* class private methods (recursively defined) */
ul fibonacci(int n){
/* BASE CASE */
if (n == 0) { return 1; }
if (n == 1) { return 1; }
/* call the function recursively */
return fibonacci(n - 1) + fibonacci(n - 2);
};
Fibonacci_node * insertR(int n, Fibonacci_node * node){
if (!node) {
/* if pointer is null create a new node */
Fibonacci_node * tmp = new Fibonacci_node;
tmp->n = n;
tmp->number = fibonacci(tmp->n);
tmp->left = tmp->right = 0;
tmp->isLeaf = 0;
/* update the pointer and return it */
node = tmp;
/* BASE CASE */
if (n == 0) {
node->isLeaf = 1;
return node;
}
if (n == 1) {
node->isLeaf = 1;
return node;
}
}
/* call the function recursively */
node->left = insertR(n - 1, node->left);
node->right = insertR(n - 2, node->right);
return node;
};
public:
Fibonacci_tree(){
root = 0;
}
~Fibonacci_tree(){}
/* class public methods (they include private methods recursively defined)*/
void insert(int n){
/* first, create initial node and compute fibonacci for the root */
Fibonacci_node * tmp = new Fibonacci_node;
tmp->n = n;
tmp->number = fibonacci(n);
tmp->isLeaf = false;
//getNo(tmp);
/* make root point to the first element of the tree */
root = tmp;
/* then call the recursive function */
root = insertR(n, root);
};
};
/* END OF CLASS DECLARATION */
/* main program to check the class */
int main(void) {
int n = 3;
/* instantiate a Fibonacci tree */
Fibonacci_tree fib_series;
/* fill the tree */
fib_series.insert(n);
return 0;
}
当我运行我的可执行文件时,我得到了
Segmentation fault: 11
我打印了几条评论,并且我注意到错误似乎在我将“false”分配给布尔值之后立即出现。所以,我假设分配出错了,但这是我第一次在这种情况下出现分段错误。
我也认为,因为到目前为止我没有遇到任何问题,但是当我在类定义中引入这个变量时就开始了。
因为这样可能会出现分段错误,或者我可能在其他地方遇到过我尚未注意到的问题吗?
我想自己完全调试它,但我的调试技巧仍然有点糟糕。因此,我们非常感谢任何反馈。
答案 0 :(得分:3)
实际问题在于:
/* call the function recursively */
node->left = insertR(n - 1, node->left);
此时node->left
尚未初始化,您将该非原始化值递归传递到insertR
,在那里检查它是否为NULL
,因为它未被初始化它很可能是非空的,然后你在这里再次取消引用它:node->left = insertR(n - 1, node->left);
。取消引用非初始化指针是未定义的行为。
其实你忘记在这里将left
和right
初始化为0:
/* first, create initial node and compute fibonacci for the root */
Fibonacci_node * tmp = new Fibonacci_node;
tmp->n = n;
tmp->number = fibonacci(n);
tmp->isLeaf = false;
tmp->left = tmp->right = 0; // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< you forgot this.
//getNo(tmp);
当你用C ++写作时,为什么不为Fibonacci_node
写一个构造函数,所有的初始化都可以在一个地方完成?
tmp->isLeaf = false;
导致计算机出现段错误只是未定义行为的结果。
答案 1 :(得分:1)
如果tmp
不是有效指针(NULL,已经释放的东西,超出范围的东西,或者首先没有正确分配的东西),这可能是原因