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

时间:2014-12-09 08:51:18

标签: c++ binary-search-tree void-pointers

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

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

  1. 我怎么能重写if语句,所以它可以在一个使用指针的方法中工作?
  2. 如何将(2)中的节点p分配给另一个临时节点?
  3. 非常感谢你。

    //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 ) {
        //??
    
        }
    }
    

2 个答案:

答案 0 :(得分:0)

我假设你想传递一个引用,所以你可以将指针清零?

这样的事情应该有效:

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

但这有点顽皮。它限制了可以调用函数的情况数,并且它增加了一些可能令人惊讶的行为,因为它改变了它的输入参数。这也意味着当节点被递归删除时,节点的left成员不必被清零(因为当前节点本身将被删除)。

答案 1 :(得分:0)

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,或者需要添加已删除节点的子节点到树中(或删除它们)。