我正在制作二进制搜索树,我按如下方式实现了插入节点代码:
BSTNode * BST::Insert(const std::string & v){
BSTNode * node = new BSTNode(v);
if (root == NULL){
root = node;
} else if (root->value.compare(v) > 0) {
Insert(root->left, node);
//recursive insert the method
} else if (root->value.compare(v) < 0) {
Insert(root->right, node);
} else {
delete node;
return NULL;
}
size++;
return node;
}
我的头文件中的递归插入方法(它具有私有访问权限):
void Insert(BSTNode* current, BSTNode* node){
if (current == NULL){
current = node;
} else if (current->value == node->value){
delete node;
} else if (current->value < node->value) {
Insert(current->left, node);
} else if (current->value > node->value){//if (parent->value < node->value) {
Insert(current->right, node);
}
}
当递归函数设置指针然后返回时,我对指针的更改不会停留。
答案 0 :(得分:3)
这里的问题是current
是一个局部变量,带有指针值的副本。它与您传入的变量不同。如果要在适当的位置修改指针,您的方法应接受指向指针的指针或指针的引用。最简单的方法是将current
修改为对指针的引用。结果代码如下所示:
void Insert(BSTNode* ¤t, BSTNode* node){
if (current == NULL){
current = node;
} else if (current->value == node->value){
delete node;
} else if (current->value < node->value) {
Insert(current->left, node);
} else if (current->value > node->value){//if (parent->value < node->value) {
Insert(current->right, node);
}
}
一般来说,你应该记住,指针只是告诉你某些内存位置的值。所以他们真的只是数字。当它们被传递给函数时,除非有引用,否则它们会被值传递。所以你的函数只看到数字,而不是包含数字的变量。
答案 1 :(得分:1)
void Insert(BSTNode*& current, BSTNode* node)
是给定函数的正确原型。没有别的东西需要改变。 Keith很好地描述了这是必要的原因。
我还要补充一点,一般情况下你应该警惕有条件地删除作为函数参数传递的指针 - 你要对该函数外部的代码施加负担,以确定它所引用的内存地址是否仍然有效或不。请考虑使用boost的shared_ptr。