Реализация функции удаления элемента из бинарного дерева
Задача вот: реализовать удаление элемента с заданным значением ключевого признака, если он расположен в дереве на заданном уровне.
Написал функцию, которая возвращает ссылку на узел, который нужно удалить. Но как правильно переставить элементы, чтобы не потерять упорядоченность? Плохим ли будет вариантом, если я перепишу дерево поэлементно, исключая удаляемый элемент? Разобрал пару чужих алгоритмов с форумов, в одном получилось так, что при удалении упорядоченность теряется, в другом - много "if-else" (сложные вложенные конструкции по 4-6). Короче говоря, хотел бы получить в ответ алгоритм удаления узла дерева, желательно через копирование в другую память, рекомендации, наставления. Насмотрелся на те алгоритмы, что есть форумах, может, конечно, хорошие пропустил.
Ответы (1 шт):
Удалить элемент из дерева поиска трудно если это не лист. Вместо удаления ищут следующий (один раз направо, потом налево до конца) или предыдущий (один раз налево, потом направо до конца) элемент. Если это лист, то его срезают с дерева, а значение записывают в "удаляемый" элемент. Если - не лист, то его удаляют рекурсивно, а значение опять-таки записывают в "удаляемый" элемент.