问题描述
struct Node{
int data;
Node* prev = nullptr;
Node* leftChild = nullptr;
Node* rightChild = nullptr;
char color;
};
void in(Node* &root,const int x){
Node* newNode = new Node;
newNode->data = x;
Node* ptr = root;
Node* setPrev = nullptr;
while(ptr != nullptr){
cout << "Did not skip" << endl;
setPrev = ptr;
if(x < ptr->data)
ptr = ptr->leftChild;
else
ptr = ptr->rightChild;
}
ptr = newNode;
ptr->prev = setPrev;
(ptr->prev == nullptr) ? ptr->color = 'B': ptr->color ='R';
if(ptr->prev != nullptr)
rotationHub(root);
}
我已经减少了代码的数量,所以rotationHub函数不会一起发布。
这是main()
int main(){
Node* root = nullptr;
in(root,10);
cout << "added" << endl;
cout << root->data << Lendl;
return 0;
}
问题是,我已经成功地在“函数”中添加了值 10。但是,如果我从 main.我将有 Segmentation fault11: 这是根 -> 数据为 nullptr;
好吧,如果我的 void in 函数没有 &root 那么即使我在 in 函数中设置了 Node* ptr = root 也没有修改 root 是有道理的。
所以就我而言,我不知道为什么我不能将根更改为 10。
解决方法
快速而丑陋的解决方法是正确操作 root
指针引用:
void in(Node* &root,const int x){
Node* ptr = root; // Makes an independent copy of the current value of root
// ... Existing code
// Manipulate the caller's variable supplied as root via reference
root = ptr;
}
如果您在调试器中逐步执行此代码,您可以看到 main()
变量 root
在该表单中的 in()
内没有改变。您正在使用它的另一个版本 ptr
,它不是引用,而是一个自变量。
就像我之前说的,ptr
的初始化复制了root
的值。变量 ptr
不引用任何东西。
是这样的:
+------+ | root | --\ +------+ \ +-------------+ >--> | actual root | +------+ / +-------------+ | ptr | --/ +------+
您有两个不同的变量,root
和 ptr
,它们指向同一位置。
然后你做作业
ptr = newNode;
现在看起来像这样:
+------+ +-------------+ | root | ----> | actual root | +------+ +-------------+ +------+ +-------------+ | ptr | ----> | newNode | +------+ +-------------+,
首先,您找到在树中插入新节点的位置,然后指向新对象 (ptr = newNode;
),而不是插入元素。相反,您希望 setPrev 通过左子节点或右子节点指向新节点。当 root 为 null 时,您需要单独的代码,这就是将指针的引用传递给函数的原因。
这是一个很好的练习,但在生产代码中,使用 std::set 或 std::map。