这是我的节点类。
class Node
{
private:
public:
T data;
Node<T>* left;
Node<T>* right;
Node(T dat) : data(dat), left(NULL), right(NULL)
{}
};
这是我的插入函数,在我的 Btree 类中定义:
public:
Node<T>* root;
Btree() : root(NULL){}
void insert(T data, Node<T>* parent)
{
if( !parent )
{
parent = new Node<T>(data);
return;
}
else if(data < parent->data)
{
insert(data, parent->left);
}
else if(data > parent->data)
{
insert(data, parent->right);
}
}
};
这是我的主要功能:
int main()
{
Btree<int> tree;
tree.insert(5, tree.root);
cout << tree.root->data << endl;
tree.insert(6, tree.root);
cout << tree.root->right->data << endl;
}
当我运行时,我得到一个段错误。
我认为是因为指针变量 parent 是按值传递的,所以当我创建一个由 parent 指向的新节点时,一旦我退出插入函数,我就会丢失它?这是否意味着我必须在这里使用双指针?
有人可以给我一个彻底的解释,说明内存中发生的事情导致这不能按计划进行。我的诊断在这里是正确的还是有其他问题?
当我将 tree.root 作为要插入的第二个参数传递时,我传递的是一个 Node*,我知道很多。现在,即使它是按值传递的,它与我从调用主函数传递的地址是否不同。因此,当我说父级(这是我从 main,tree.root 传递的地址)=新节点时,是否不应该在父级地址的堆上创建一个新节点,也就是 tree.root 的地址?为什么按价值传递会掩盖这一点?