【问题标题】:C++ - Having trouble understanding pointer modification/assignment and pointer referencesC++ - 无法理解指针修改/赋值和指针引用
【发布时间】:2020-02-25 15:12:36
【问题描述】:

我有一棵看起来像这样的二叉树

struct Node 
{
  int key;
  double data;
  Node* right;
  Node* left;
};

我有这个“插入”函数来插入新节点和构建树

void insert(Node*& p, int key, double to_be_inserted) 
{
  if (p == nullptr) 
  {
    p = new Node;
    p->key = key;
    p->data = to_be_inserted;
    p->left = nullptr;
    p->right = nullptr;
  }
  else 
  {
    if (p->key == key) 
    {
      p->data = to_be_inserted;
    }
    else 
    {
      Node*& child = (p->key > key) ? p->left : p->right;
      insert(child, key, to_be_inserted);
    }
  }
}

还有一个看起来像这样的主函数

int main(int argc, char ** argv) 
{
  Node* root = nullptr;
  insert(root, 11, 11);
  insert(root, 6, 6);
  insert(root, 4, 4);
  insert(root, 5, 5);
  insert(root, 8, 8);
  insert(root, 10, 10);
  insert(root, 19, 19);
  insert(root, 17, 17);
  insert(root, 43, 43);
  insert(root, 31, 31);
  insert(root, 49, 49);

  printTree(root, 0);
  return 0;
}

最终“打印出来”的树看起来像这样

(这个“打印输出”是指从左到右而不是从上到下阅读)

我的问题是:

  1. insert 函数如何知道树在第二次(或更多次)被调用时当前的样子? root in main 只是一个不变的节点(有两个孩子)(根据我的调试器),并且您多次使用相同的 root 作为参数。当再次调用insert 时,它如何知道它停止的位置? p = new Node 行实际上在做什么(在 insert 中)。在我看来,它只是一遍又一遍地覆盖根目录?基本上,它在哪里存储(当前)完整树的样子?

    1. 如果 insert 函数声明为 Node * insert(Node * p, int key, double value);?

    2. p 是指针引用而不是普通指针是否有特定原因?有什么区别?

抱歉,问题很长(而且可能很愚蠢)。我是 C++ 新手。我了解指针和引用的基础知识,但显然我似乎无法弄清楚insert 函数中实际发生的情况(以及在主函数中,当insert 被相同@987654337 多次调用时@参数)。

谢谢!

【问题讨论】:

    标签: c++ pointers reference tree pass-by-reference


    【解决方案1】:

    当第二次(或更多次)调用时,插入函数如何知道树当前的样子?

    因为根节点保留了它的两个孩子的记忆,它的孩子保留了他们每个孩子的记忆,而且……

    插入函数从一个节点开始,在这个块中

        else 
        {
          Node*& child = (p->key > key) ? p->left : p->right;
          insert(child, key, to_be_inserted);
        }
    

    确定应该“向下钻取”哪个分支以找到要插入的空节点。在节点处插入的每个值都会遍历树,直到找到正确的插入位置。

    如果将插入函数声明为 Node * insert(Node * p, int key, double value); 会有不同的行为吗?

    是的,如果在您的问题中如上声明,p 类型为 Node * 的值将作为局部变量从 main 复制到函数 insert 中。对insert 中p 的任何更改都将是本地的,不会影响main 中root 的值。当您通过引用传递时,对 insert 中的 p 所做的任何更改都会影响 main 中的 root。如果不按引用传递,root 将永远是nullptr,而insert 只会执行这个分支:

      if (p == nullptr) 
      {
        p = new Node;
        p->key = key;
        p->data = to_be_inserted;
        p->left = nullptr;
        p->right = nullptr;
      }
    

    这会泄漏内存。

    p 是指针引用而不是普通指针有什么具体原因吗?有什么区别?

    见上

    【讨论】:

    • 感谢您的解释!很确定我现在明白了:)
    猜你喜欢
    • 1970-01-01
    • 2011-10-27
    • 2012-07-19
    • 2013-09-26
    • 2013-05-15
    • 1970-01-01
    • 1970-01-01
    • 2014-10-15
    相关资源
    最近更新 更多