Для эффективного поиска последнего узла в куче, реализованной в виде дерева, необходимо поддерживать количество узлов. То есть вы знаете, сколько элементов в куче.
Если вы знаете, сколько элементов в куче, то вы получаете двоичное представление числа и используете его для отслеживания через дерево до последнего узел. Позвольте привести пример. У вас есть эта куча:
1
/ \
2 3
/ \ / \
4 5 6
В куче 6 предметов. Двоичное представление: 110
.
Теперь, перемещаясь справа налево в двоичном представлении. Вы удаляете первую '1' и вы находитесь на узле root. Правило состоит в том, что вы go вправо, если di git равно '1', и налево, если di git равно '0' В узле root у вас есть 10
. Итак, вы go правы и удалите эту ди git, оставив вам 0
. Вы находитесь на узле с отметкой «3». Оставшийся ди git равен 0
, поэтому вы go ушли. Это помещает вас в последний узел в куче.
Алгоритм отсеивания кучи одинаков, независимо от того, представлена ли куча в виде массива или дерева. Конечно, фактические шаги, которые вы предпринимаете, чтобы поменять узлы, отличаются. При замене узлов вы должны быть осторожны, чтобы правильно установить дочерние указатели. Люди часто забывают о том, что при обмене узлом root с последним узлом.
Мое предложение заключается в том, чтобы вы кодировали это, а затем пошагово выполняли отладчик, чтобы убедиться в правильности назначения указателей. .