Ciao, provo a spiegartelo io, anche se il codice non è il mio.
Il "for" più esterno serve per ripetere le seguenti operazioni per ogni riga (infatti il ciclo viene eseguito esattamente "n" volte).
Il primo "for" interno serve per contare e stampare gli spazi. Ovvero esplicita la relazione che esiste fra il numero di spazi, il numero totale di righe e la riga corrente: in particolare si ha che il numero di spazi è dato da (righe totali - riga corrente - 1).
Il secondo ciclo interno stampa la sequenza di "-"; anche qua si è individuata la relazione: (numero di "-" = riga corrente*2 - 1).
Infine l'if serve solamente perché la prima riga rappresenta un caso particolare (è l'unica ad avere un solo carattere "+", mentre le altre ne hanno tutte 2). Di conseguenza se si omettesse questa condizione si avrebbe un albero del tipo:
++
+-+
+---+
+-----+