that pointers in modern C++ must be avoided unless really needed
это неправильно.
new
и delete
следует избегать, и вместо этого следует использовать уникальные и общие указатели.
Но вы все равно будете передавать объект по ссылке или необработанному указателю, если вы не перенесете владение.
У вас Node
есть отношение владения, поэтому оно должно быть:
struct Node
{
int data;
std::unique_ptr<Node> left;
std::unique_ptr<Node> right;
};
или
struct Node
{
int data;
std::shared_ptr<Node> left;
std::shared_ptr<Node> right;
};
Ваша display
функция не требует владения, поэтомувы передаете узел как указатель (или ссылку)
void display(Node *root)
{
if (root != nullptr)
{
display(root->left);
cout << root->data << " ";
display(root->right);
}
}
Поскольку вы не планируете его менять, я бы пошел с const ref:
void display(const Node &root)
{
if(root.left != nullptr) {
display(*root.left);
}
cout << root.data << " ";
if(root.right != nullptr) {
display(*root.right);
}
}
Вы insert_ref_to_ptr
- этодействительно плохая конструкция, потому что не ясно, что она передает какую-либо собственность и как не ясно, что она вызывает create(data)
внутри, которые создают Node, используя new
.
Создание будет выглядеть примерно так:
std::unique_ptr<Node> create(int data)
{
auto node = std::make_unique<Node>();
node->data = data;
return std::move(node);
}
И функция insert_ref_to_ptr
примерно такая:
void insert_ref_to_ptr(std::unique_ptr<Node> &root, int data)
{
if (root == nullptr)
root = std::move(create(data));
else if (data < root->data)
insert(root->left, data);
else
insert(root->right, data);
}