引用指针的递归调用和赋值

Recursive call and assignment of reference pointers

本文关键字:赋值 调用 递归 指针 引用      更新时间:2023-10-16

我对 c++ 中的指针感到困惑,我正在尝试实现 BST。

而不是(方法1)具有节点类型,我想使用引用指针(方法2)。

  1. 我怎么能重写 if 语句,这样它就可以在使用指针的方法中工作?
  2. 如何将 (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 ) {
    //??
    }
}
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删除的节点是否为叶子,或者您需要将已删除节点的子节点添加到树中(或删除这些子节点)。

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

这样的事情应该有效:

void delete_node(int key, node*&p)
{
    if (key < p->key) {
        delete_node(key, p->left);
        delete(p);
        p = nullptr;
    }
}

但这有点调皮。它限制了可以调用函数的情况数量,并增加了一些潜在的令人惊讶的行为,因为它会改变其输入参数。这也意味着当递归删除节点时,节点的left成员被不必要地清零(因为当前节点本身无论如何都会被删除)。