Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
引用指针的递归调用和赋值 我感到困惑的是C++中的指针,我试图实现BST. _C++_Binary Search Tree_Void Pointers - Fatal编程技术网

引用指针的递归调用和赋值 我感到困惑的是C++中的指针,我试图实现BST.

引用指针的递归调用和赋值 我感到困惑的是C++中的指针,我试图实现BST. ,c++,binary-search-tree,void-pointers,C++,Binary Search Tree,Void Pointers,我希望使用引用指针方法2,而不是方法1具有节点类型 如何重写if语句,使其在使用指针的方法中工作? 如何将2中的节点p分配给另一个临时节点? 非常感谢你 //1 node* delete(node* p, int k) // deleting k key from p tree { if( k < p->key ) p->left = remove(p->left,k); } //2 void delete(int key, node*& p)

我希望使用引用指针方法2,而不是方法1具有节点类型

如何重写if语句,使其在使用指针的方法中工作? 如何将2中的节点p分配给另一个临时节点? 非常感谢你

//1

node* delete(node* p, int k) // deleting k key from p tree
{
  if( k < p->key )
    p->left = remove(p->left,k);
}

//2

void delete(int key, node*& p) {
// recursive call while key is less and assign a new left child.
   if( k < p->key ) {
    //??

    }
}

我假设你想传递一个引用,这样你就可以调零指针了

像这样的方法应该会奏效:

void delete_node(int key, node*&p)
{
    if (key < p->key) {
        delete_node(key, p->left);
        delete(p);
        p = nullptr;
    }
}
但这有点淘气。它限制了可以调用函数的情况的数量,并添加了一些可能令人惊讶的行为,因为它改变了输入参数。这还意味着当递归删除节点时,节点的左成员不一定会被清零,因为当前节点本身无论如何都会被删除

node *getNode(int key, node *haystack){
    if(!haystack)
        return NULL;
    if(haystack->val == key)
        return haystack;
    if(haystack->val < key)
        return getNode(key, haystack->left);
    return getNode(key, haystack->right);
}

void getNode(int key, node *haystack, node *&result){
    if(!haystack){
        result = NULL;
        return;
    }
    if(haystack->val == key){
        result = haystack;
        return;
    }
    if(haystack->val < key){
        return getNode(key, haystack->left, result);
    }
    return getNode(key, haystack->left, result);
}

他们最终几乎是一样的。但是,如果确实要删除,则需要做更多的工作,因为如果删除的节点是叶子,则需要将已删除节点指向已删除节点的指针设置为NULL,或者需要将已删除节点的子节点添加到树中或将其删除。

方法1不起作用。你可能想返回一些东西。删除是C++中的关键词。非常感谢你的回应。您的方法可能有效,但我无法指定某些内容,在本例中为void方法。我需要使用指针。这是我可以采取的其他方法吗?你们不能区分草堆和结果。也就是说,没有结果参数,并传入一个head副本作为初始参数。