Поиск и удаление BST предшественника (или преемника) - PullRequest
0 голосов
/ 11 мая 2019

Как я могу рекурсивно удалить предшественника (или преемника) данных из двоичного дерева поиска? Данные могут содержаться или не содержаться в дереве.

Функция должна возвращать ключ, сохраненный в узле-предшественнике (или преемнике).

1 Ответ

0 голосов
/ 11 мая 2019

Предположим, что вы хотите удалить узел, содержащий наибольшее значение, меньшее некоторого целевого значения t , где t само по себе не обязательно является значением какого-либо узла в дереве, подумайте, какие результаты вы можете получить, выполнив поиск в BST для значения t . Есть три варианта:

  1. Вы найдете т . Это сводится к вашему предыдущему вопросу - вы просто должны выполнить то же отслеживание, что и в этом случае.
  2. Вы попадаете на узел N , значение которого больше t , и у которого нет левого потомка. В этом случае дерево не содержит t или любое значение между t и значением N . Поэтому вы хотите удалить предшественник N , если он есть, поэтому он снова сводится к ситуации предыдущего вопроса.
  3. Вы попадаете на узел M , значение которого меньше t , и у которого нет правого потомка. В этом случае дерево не содержит t или любое значение между M и t , поэтому M - это узел, который вы хотите удалить.
...