Codice su pastebin: http://pastebin.com/wq65fpZv
Download del codice: http://pastebin.com/download.php?i=wq65fpZv
QVector<myStruct> buildBSTOnArray(QVector<myStruct> vettoreInput){ //fase di costruzione dell'albero binario di ricerca bilanciato su vettore //prelevo il numero di endpoint memorizzati int dimensione=vettoreInput.size(); //calcolo il livello dell'albero che incomincia a contenere le foglie dell'albero bilanciato int livello_i=(int)floor(log2((double)dimensione)); //calcolo poi quanti elementi usualmente stanno in un albero pieno di quel livello int elementiLivello_i=(int)pow(2.0,livello_i); //scopro quanti nodi del livello i 'passano' da foglie a padri per delle foglie del livello i+1 int nodiLivello_i= dimensione-elementiLivello_i; //Calcolo quanti elementi devo spostare in coda al vettore per ottenere la rappresentazione corretta dell'albero int foglieLivello_ip1= nodiLivello_i*2; //...e quindi effettuo, se necessario, gli spostamenti int i; //vettore risultato contenente il BST QVector<myStruct> vettoreBST; myStruct nodo; //////////fase di valorizzazione delle foglie if(foglieLivello_ip1>0){ //se il numero di foglie non è una potenza di 2, allora devo spostare i primi 'foglieLivello_ip1' elementi in fondo al vettore //oppure portare in testa gli elementi dopo i primi 'foglieLivello_ip1' elementi for(i= foglieLivello_ip1;i<=dimensione-1;i++){ nodo.key=vettoreInput[i].getKey(); nodo.isLeaf=true; //Aggiungo il nodo vettoreBST.push_back(nodo); } //ora aggiungo i primi elementi for(i=0;i<=foglieLivello_ip1-1;i++){ nodo.key=vettoreInput[i].getKey(); nodo.isLeaf=true; //Aggiungo il nodo vettoreBST.push_back(nodo); } }else{ //ho un numero di foglie pari ad una potenza di 2 e non devo spostare nulla, li copio semplicemente in fondo al vettore for(i=0;i<=dimensione-1;i++){ nodo.key=vettoreInput[i].getKey(); nodo.isLeaf=true; //Aggiungo il nodo vettoreBST.push_back(nodo); } } //////////fase di valorizzazione dei nodi interni //Si effettua la costruzione 'bottom-up' dell'albero valorizzando tutti i nodi padre delle foglie precedentemente inserite //'Puntatori' a figli sinistro e destro per un particolare nodo genitore int leftC,rightC; //Inizializzazione dei puntatori ai figli sinistro e destro: inizialmente corrispondono agli ultimi due elementi del vettore finora riempito con delle 'foglie' leftC=dimensione-2; rightC=dimensione-1; //costruzione 'bottom-up' for(i=dimensione-1;i>0;i--){ //indico che non è una foglia del bst nodo.isLeaf=false; //aggiungo il nodo padre vettoreBST.push_front(nodo); //decremento i 'puntatori' ai figli per provedere con la costruzione 'bottom-up' leftC--; rightC--; }//fine for padri //valorizzazione dei campi key dei nodi padre(interni), che permettono la ricerca all'interno dell'albero binario bilanciato for(i=0;i<=dimensione-2;i++){ //valorizzo per ogni nodo padre il valore key che mi permette di condurre la ricerca //la chiave per i nodi padre sarà il valore chiave dell'ultima foglia del suo sottoalbero sinistro int indice=i; indice=indice*2+1;//vado al figlio sinistro //mi sposto nei sotto alberi destri while(!(vettoreBST[indice].isLeaf)){ indice=indice*2+2; } //ora ho la chiave da memorizzare nel nodo padre per condurre la ricerca vettoreBST[i].key=vettoreBST[indice].key; } //restituisco il vettore contenente il BST return vettoreBST; }