Вы неправильно понимаете возвращаемое значение.
Возвращаемое значение этой функции insert
является указателем на поддерево, в которое теперь вставлено data
.Если переданный в root
был нулевым, это новое дерево 1 узла;если переданный в root
не равен NULL, возвращаемое значение будет таким же root
.
. Это делает рекурсию немного проще.Мы просто выполняем рекурсию, пока не встретимся с nullptr
в ветке.Затем рекурсия останавливается, и возвращаемое значение устанавливает родительский узел left
или right
.
Чтобы создать новое дерево, введите:
node* new_tree = insert(nullptr, 7);
, чтобы вставить что-либо всуществующее дерево, которое вы вводите:
existing_tree = insert(existing_tree, 7);
или эквивалентно
insert(existing_tree, 7);
, пока existing_tree
не равно нулю.
Это «двойное использование» функции(как для создания, так и для изменения дерева) может сбить с толку, но это делает конкретное рекурсивное использование чуть менее многословным, и делает "пустое дерево пустым", а "всегда делать existing_tree = insert(existing_tree, val);
" - это правило, которое делает пустое деревокак работает нулевое дерево.
Это, однако, очень простой способ ведения дел на языке Си.
Более совершенный c ++ способ ведения дел будет таким:
std::unique_ptr<node> insert(std::unique_ptr<node> root, int data)
{
if (root == nullptr) //If the tree is empty, return a new,single node
return std::make_unique<node>(data);
else
{
//Otherwise, recur down the tree
if (data <= root->data)
root->left = insert(std::move(root->left), data);
else
root->right = insert(std::move(root->right), data);
return std::move(root);
}
}
, где поток данных в и из функции является более явным, и мы предполагаем, что node
имеет конструктор, который принимает data
.