andr3a, il mio amico ha risposto all'appello...nn ha (e non ho) potuto provare il tutto...è ancora scritto in java, se vuoi metterci le mani fai pure. funziona con l'array dei livelli del modified, quindi sempre riprendendo l'esempio di freephp:
codice:
massimiliano | 1
francesco | 2
mario | 3
luigi | 3
fabio | 3
piero | 4
gianni | 4

codice:
/*Tutti gli algoritmi sono in base alla struttura dati per cui un albero e' rappresentato da un vettore dei livelli di profondita' dell'albero
in ordine di viitazione di profondita', ovvero in [i] ho il livello di profondita' del nodo i*/
/*sposta un ramo da sinistra a destra
in [0] ritorna il nuovo albero e in [1] ritorna i nuovi nodi mappati ovvero in [1][i] e' presente il,l nuovo numero del nodo[i]
lo spostameno avviene copiando i vari pezzi dell'albero in un nuovo albero*/
static[][]sposta_ramo( int[]vecchio_albero, int padre_ramo, int nuovo_padre) {
int[]nuovo_albero = new int[vecchio_albero.length];
int[]nuovi_nodi = new int[vecchio_albero.length];
copia_albero_parziale(vecchio_albero, nuovo_albero, nuovi_nodi, 0, padre_ramo-1, 0);
int fine_ramo = fine_ramo(vecchio_albero, padre_ramo);
int fine_ramo_nuovo_padre = fine_ramo(vecchio_albero, nuovo_padre);
copia_albero_parziale(vecchio_albero, nuovo_albero, nuovi_nodi, fine_ramo+1, fine_ramo_nuovo_padre, padre_ramo);
copia_ramo(vecchio_albero, nuovo_albero, nuovi_nodi, padre_ramo, nuovo_padre);
copia_albero_parziale(vecchio_albero, nuovo_albero, nuovi_nodi, fine_ramo_nuovo_padre+1, vecchio_albero.length-1, nuovi_nodi[fine_ramo]+1;
int[][]ritorno;
ritorno[0] = nuovo_albero;
ritorno[1] = nuovi_nodi;
}
//trova il nodo finale di un ramo
int fine_ramo(int[]albero, int padre_ramo) {
int fine_ramo = padre_ramo;
int nodo_corrente = fine_ramo+1;
while (albero[nodo_corrente]>albero[padre_ramo] && nodo_corrente<albero.length) {
fine_ramo = nodo_corrente;
nodo_corrente++;
}
return fine_ramo;
}
//copia un intero ramo
static copia_ramo( int[]vecchio_albero, int[]nuovo_albero, int[]nuovi_nodi, int padre_ramo, int nuovo_padre) {
int posizione_nuovo_nodo;
int fine_ramo = fine_ramo(padre_ramo);
int inizio_nuovo_ramo = fine_ramo(nuovo_albero, nuovi_nodi[nuovo_padre])+1;
int livello_nuovo_padre = nuovo_albero[nuovi_nodi[nuovo_padre]];
for (int i = 0;i<= fine_ramo-padre_ramo;i++) {
posizione_nuovo_nodo = inizio_nuovo_ramo+i;
nuovo_albero[posizione_nuovo_nodo] = vecchio_albero[i+padre_ramo]-vecchio_albero[padre_ramo] + 1 + livello_nuovo_padre;
nuovi_nodi[padre_ramo+i] = posizione_nuovo_nodo;
}
return;
}
//copia un pezzo di albero e aggiorna i nuovi nodi
static copia_albero_parziale( int[]vecchio_albero, int[]nuovo_albero, int[]nuovi_nodi, int inizio_ramo, int fine_ramo, int inizio_nuovo_ramo) {
int posizione_nuovo_nodo;
for (int i = 0;i<=fine_ramo-inizio_ramo;i++) {
posizione_nuovo_nodo = inizio_nuovo_ramo+i;
nuovo_albero[posizione_nuovo_nodo] = vecchio_albero[i+inizio_ramo];
nuovi_nodi[i+inizio_ramo] = posizione_nuovo_nodo;
}
return;
}