You are asking several related questions. I will only answer the first one. The heapify procedure gets an almost-heap $A$ and a node $i$. The heap property is satisfied for all nodes except for $i$. Heapify proceeds as follows:
- Determine the largest child $j$ of $i$.
- If $A[i] \geq A[j]$, the heap property is already satisfied.
- Otherwise, exchange $A[i]$ and $A[j]$, and run heapify on $A$ and $j$.
After the exchange, the heap property is no longer violated for $i$, but might be violated for $j$. For this reason we have to call heapify recursively on the node $j$.
I suggest you try a few examples and see for yourself that sometimes the recursive call is necessary.