Там вы 3 части в удалении узла из бинарного дерева поиска:
- найти узел для удаления.
- Удалить узел (свободная память и т. Д.).
- Объединить детей удаленного узла.
В вашем конкретном примере кода, я бы сказал, что ищет узел должен нести ответственность void delete_node_helper(string s);
, удаление узла должна быть ответственность void delete_node(Node *cur, string s);
, и объединение детей должны нести ответственность за вновь созданной функция.
Учитывая, что алгоритмы первых двух частей довольно просты, позвольте мне подробно объяснить только третий.
Чтобы слить два BST
s (из которых мы знаем, какой из них оставлен, а какой правильный), мы должны решить, кто будет дочерним и, если необходимо, выполнить рекурсивное слияние. Код выглядит так:
Node* merge(Node* left, Node* right) {
if (left == nullptr) {
return right;
}
if (right == nullptr) {
return left;
}
if (rand() & 1) { // <- chose parent
left->right = merge(left->right, right);
return left;
}
right->left = merge(left, right->left);
return right;
}
На отмеченной строке мы фактически принимаем решение о том, какой узел будет родителем. В этом конкретном примере результат случайный, но любая другая стратегия может быть реализована. Например, вы можете хранить высоты (или размеры) во всех узлах вашего дерева и делать меньший корень дерева корней большего корня дерева.
Лучшим способом является использование умного указателя как 'std :: unique_ptr' вместо 'Node *'. –
Jarod42
Как именно вы хотите удалить узел? Вы хотите заменить его заполнителем или удалить? Должна ли балансировка дерева после этого удаления? Какова ожидаемая асимптотическая сложность? – alexeykuzmin0
А что такое 'rep'? – alexeykuzmin0