Другое решение, помимо родительских указателей и повторного запроса родительского элемента, заключается в поддержании стека предков.
Предположим, кто-то хочет вставить 23 в следующее дерево:
Красное черное дерево
Обычно алгоритм для вставки:
Найти узел, где 23 будет, если он находится в дереве
Если 23 уже существует, вернуть ошибку
Если 23 еще не существует, поместите его туда.
Запустите процедуру перебалансировки / окраски по мере необходимости.
Теперь, чтобыиспользуя подход стека, вы выделяете стек, достаточно большой, чтобы поддерживать один узел на уровень вашего дерева (я думаю, что 2 * Ceiling (Log2 (count)) + 2) должны вас охватить.Вы могли бы даже сохранить стек, выделенный для вставки или удаления, и просто очищать его каждый раз, когда начинаете вставку.
Итак - посмотрите на корень.Вставьте его в стек.23 больше значения в корне, так что идите направо.Теперь поместите текущий узел (значение 21) в стек.Если 23 находится в дереве, оно должно быть справа от текущего узла.Но узел справа от текущего узла является нулевым сторожем.Таким образом, этот null-sentinel должен быть заменен узлом с вашим значением.Родитель - это элемент в верхней части стека (последний раз помещен в стек), дедушка - следующий в очереди ... и т. Д. Так как вы, кажется, изучаете ... Java предоставляет интерфейс стека для вас, поэтому вам не понадобитсяразработать свой собственный стек, чтобы сделать это.Просто используйте их.
Что касается того, лучше ли это, чем подход с родительским указателем, это представляется мне спорным - я бы склонялся к подходу с родительским указателем для простоты и устранения необходимости поддерживать структуру вспомогательных данных.или широко использовать рекурсию.Тем не менее, любой подход лучше, чем запрашивать родительский узел текущего узла, когда вы применяете свою процедуру перебалансировки / окрашивания.