У меня есть двоичное дерево, которое выглядит следующим образом
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;
}
Окончательное «распечатанное» дерево выглядит так:
![enter image description here](https://i.stack.imgur.com/K5bHm.png)
(This) print- out "предназначен для чтения слева направо, а не сверху вниз)
Мои вопросы:
Как функция insert
знает, что такое дерево в настоящее время выглядит, когда он вызывается во второй (или более) раз? root
в main - это всего лишь один узел (с двумя дочерними элементами), который не меняется (согласно моему отладчику), и вы используете один и тот же root
в качестве аргумента несколько раз. Как он узнает, где остановился, когда insert
вызывается снова? Что на самом деле делает строка p = new Node
(в insert
). Мне кажется, что он просто перезаписывает root, снова и снова? В основном, где хранится память о том, как выглядит (текущее) полное дерево?
Будет ли функция insert
вести себя иначе, если она будет объявлена как Node * insert(Node * p, int key, double value);
?
Есть ли конкретная c причина, по которой p
является указателем ссылка вместо обычного указателя? Какая разница?
Извините, за длинные (и, возможно, глупые) вопросы. Я новичок в C ++. Я понимаю основы указателей и ссылок, но, по-видимому, я не могу понять, что на самом деле происходит в функции insert
(и в основной функции, когда insert
вызывается несколько раз с помощью одного и того же root
параметр).
Спасибо!