【问题标题】:Pointer assignment does not work in recursive function指针赋值在递归函数中不起作用
【发布时间】:2020-02-16 18:39:35
【问题描述】:

我有一个二叉树程序,当我试图遍历树以插入递归函数指针赋值时似乎不起作用。首先是插入功能不起作用:

void append(Node* &curr, int val){

    if(curr==nullptr){
        Node* newNode = new Node(val);
        std::cout << "Created new Node with value: " << newNode->value << std::endl;
        curr = newNode;
        return;
    }
    if(curr->value > val){
        curr = curr->left;
        append(curr, val);
    }
    else{
        curr = curr->right;
        append(curr,val);
    }
}

但是当我像下面这样调整相同的功能时,它似乎工作得很好:

void append(Node* &curr, int val){
        if(curr==nullptr){
            Node* newNode = new Node(val);
            std::cout << "Created new Node with value: " << newNode->value << std::endl;
            curr = newNode;
            return;
        }
        if(curr->value > val){
            append(curr->left, val);
        }
        else{
            std::cout << "Right" << curr->value << std::endl;
            append(curr->right,val);
        }
    }

我在几个小时的工作后来解决这个问题,但仍然无法理解为什么第一个功能不起作用而第二个功能按预期工作。希望有人能告诉我为什么 curr=curr->left 与将 curr->left 传递给递归不同。

【问题讨论】:

  • “不工作”不是一个好的问题描述。
  • 想想curr = newnode如何将新分配的节点返回给调用者。这与curr = curr-&gt;left 有什么关系?

标签: c++ algorithm binary-search-tree


【解决方案1】:

在这个函数实现中

void append(Node* &curr, int val){

    if(curr==nullptr){
        Node* newNode = new Node(val);
        std::cout << "Created new Node with value: " << newNode->value << std::endl;
        curr = newNode;
        return;
    }
    if(curr->value > val){
        curr = curr->left;
        append(curr, val);
    }
    else{
        curr = curr->right;
        append(curr,val);
    }
}

由于指针 curr 是通过引用传递的,所以在这些语句中

        curr = curr->left;
        curr = curr->right;

指针的值被覆盖。

注意,第一个 if 语句可以重写更简单,而无需引入中间变量。

    if ( curr == nullptr ){
        curr = new Node(val);
    }

【讨论】:

  • 只是为了澄清我的理解,我做错了什么,是我试图为引用权赋值吗? (由于 curr 是一个引用“内存地址”,我不能只说内存地址等于其他内存地址或“指针”吗?)
  • @PriyankTrivedi 假设第一次调用递归函数并且指向列表头节点的指针不等于 nullptr,在这种情况下,它的值将被覆盖,例如 curr 的值->下一步。所以指针不会指向列表的第一个节点。第一个节点的地址会丢失。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-21
  • 2011-01-20
  • 2013-01-23
  • 1970-01-01
  • 2019-10-05
  • 1970-01-01
  • 2018-07-14
相关资源
最近更新 更多