【问题标题】:Recursive call and assignment of reference pointers递归调用和引用指针的赋值
【发布时间】:2014-12-09 08:51:18
【问题描述】:

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

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

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

    }
}

【问题讨论】:

  • 方法 1 行不通。你可能想退货。
  • delete 是 C++ 中的关键字。

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


【解决方案1】:
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 方法。我需要使用指针。我可以采取其他任何方法吗?
  • 你不能区分干草堆和结果。也就是说,没有结果参数,并传入一个 head 的副本作为初始参数。
【解决方案2】:

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

这样的事情应该可以工作:

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

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

【讨论】:

    猜你喜欢
    • 2018-09-08
    • 2012-07-19
    • 2013-12-11
    • 1970-01-01
    • 2016-02-05
    • 1970-01-01
    • 1970-01-01
    • 2013-05-13
    • 1970-01-01
    相关资源
    最近更新 更多