【发布时间】: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;
}
最终“打印出来”的树看起来像这样
(这个“打印输出”是指从左到右而不是从上到下阅读)
我的问题是:
-
insert函数如何知道树在第二次(或更多次)被调用时当前的样子?rootin main 只是一个不变的节点(有两个孩子)(根据我的调试器),并且您多次使用相同的root作为参数。当再次调用insert时,它如何知道它停止的位置?p = new Node行实际上在做什么(在insert中)。在我看来,它只是一遍又一遍地覆盖根目录?基本上,它在哪里存储(当前)完整树的样子?如果
insert函数声明为Node * insert(Node * p, int key, double value);?p是指针引用而不是普通指针是否有特定原因?有什么区别?
抱歉,问题很长(而且可能很愚蠢)。我是 C++ 新手。我了解指针和引用的基础知识,但显然我似乎无法弄清楚insert 函数中实际发生的情况(以及在主函数中,当insert 被相同@987654337 多次调用时@参数)。
谢谢!
【问题讨论】:
标签: c++ pointers reference tree pass-by-reference