1.- No, tu al tener un puntero modificás el item como quieras y luego simplemente invocas a updateItem para restaurar al
2.- Tiene dos motivos:
a) el primero por buenas prácticas de programación. El programador del heap no tiene porque ser el usuario del heap, por ende el usuario del heap no tiene que saber nada de la estructura interna del heap. Por ejemplo, vos podés hacer un extractMIn sin saber que los datos están guardados en un array. El heap se puede implementar con otras estructuras de datos que son arrays. Si usás la posición 0, quedás atado a eso.
b) Hay algoritmos en los cuales tu tenés que hacerle una pregunta al mínimo antes de sacarlo, dependiendo de la respuesta lo sacás o no. Si lo sacás siempre, y no tenías que hacerlo, terminás teniendo que agregarlo de nuevo.
3.- El heap siempre está ordenado, cada vez que vos lo tocás, lo rompés. Por ejemplo, al agregar, quitar o modificar un item. Si agregás un item, va abajo de todo y por lo tanto hay que arreglar 'hacia arriba'. Si borrás el de arriba, lo cambiás por el último, y tenés que arreglar hacia abajo. En el updateItem, es posible que tengas que arreglar hacia ambos arriba o hacia abajo. Pensalo un poco. Luego con respecto hacia que lado tenés que bajar, la respuesta es: tenés que bajar para el lado que te garantice que la propiedad de heap (orden parcial) se mantenga. Pensalo un poco y verás que es una decisión fácil.
Saludos,
Juan