У меня возникли проблемы при попытке определить рекурсивный случай. Как дать правильный индекс для рекурсивного вызова? (начальный индекс с 1 вместо 0) Если первый узел хранится в слоте i, то я знаю, что его левый и правый узлы хранятся в слоте 2 * i и 2 * i + 1 соответственно, а также их собственные левый и правый узлы. Как передать эту информацию рекурсивно?
Текущая реализация не работает, потому что она не будет смотреть на все конечные узлы. Минимальным элементом будет один из листовых узлов.
Если вы хотите сделать это рекурсивно, тогда вы можете начать с узла root в max-heap и получить минимум из двух его поддеревьев, как показано ниже -
def getSmallestNumber (maxHeapArray , size):
#assuming maxHeapArray has at least one element
#and 1-based indexing
return helper(maxHeapArray, size, 1)
def helper (maxHeapArray, size, currentIndex):
if currentIndex >= size:
return maxHeapArray[currentIndex]
currentNumber = maxHeapArray[currentIndex]
leftIndex = 2 * currentIndex
rightIndex = 2 * currentIndex + 1
leftMin = helper(maxHeapArray, size, leftIndex)
rightMin = helper(maxHeapArray, size, rightIndex)
return min(currentNumber, leftMin, rightMin)
You также можно выполнить линейный обход полного массива или половины элементов. Сложность времени для получения минимальных элементов из max-heap