Salve a tutti,

Devo scrivere un metodo in c++ che : dato un albero binario di ricerca, in cui sono inseriti, come in una mappa(STL):

chiave=> Numero Identità alunno;
valore=> Alunno;

mi restituisca il numero di volte in cui compare un alunno il cui numero di identità comincia per 3;

Ho provato a scrivere questo ma non funziona (mi restituisce sempre 0) :

codice:
/**
 *  Funzione che ritorna il numero dei DNI (num. identità alunni) che cominciano per 3 (chiama a cuentaDNI3Aux).
 *
 *  @return Numero di DNI che cominciano per 3.
 */

unsigned ABB::cuentaDNI3() const
{
    return cuentaDNI3Aux(miRaiz);
}

/**
 *  Funzione ausiliare di cuentaDNI3.
 *
 *  @param raiz  Nodo radice
 *
 */

unsigned ABB::cuentaDNI3Aux(ABB::PtrNodoBin raiz) const{

    int count;

    if(raiz==NULL)
        count=0;
    else {
        if (raiz->clave[0]==3)
            count = 1 + cuentaDNI3Aux(raiz->izq) + cuentaDNI3Aux(raiz->der);
        cout << "\n";
        cout << "He encontrado " << count << " DNI que comienzan por 3" << endl;
    }
    return count;
}
è in spagnolo dunque izq => sinistra; der=>destra; miRaiz = nodo radice albero binario;

Altra cosa :

il modo di inserire il numero di DNI dovrebbe essere aleatorio... perchè invece mi calcola sempre DNI che cominiciano per 5 e maggiori?
Di seguito il metodo per la creazione dei DNI e il Main() per la prova :

classe alunno :

codice:
/**
 * Implementacion de la clase Alumno
 * Curso 2015/2016
 */

#include "alumno.h"
#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
#include <sstream>

using namespace std;

// Nombres de ejemplo
string Alumno::list_nombre[] = {
        "Javier",
        "Jorge",
        "Angel",
        "Raul",
        "Jose",
        "Inigo",
        "Jose Antonio",
        "Julio",
        "Beatriz",
        "Ismael",
        "Oliver",
        "Carlos",
        "Alberto",
        "Francisco Manuel",
        "Lluis Carles"  };

// Apellidos de ejemplo
string Alumno::list_apellido[] = {
        "Albaladejo" ,
        "Albiach" ,
        "Aldana" ,
        "Alonso" ,
        "Anda" ,
        "Andres" ,
        "Angel" ,
        "Aranda" ,
        "Bernal" ,
        "Bonell" ,
        "Calderon" ,
        "Chakkour" ,
        "Contreras" ,
        "Correa" ,
        "Dacasa" };


/**
 * Constructor Alumno.
 * Genera un alumno con datos aleatorios excepto el curso, que se pasa como parametro.
 * @param curs curso del alumno
 */
Alumno::Alumno(unsigned curs): curso(curs)
{
    unsigned num = rand() % 100000000;
    stringstream s;
    s << num;
    string letra;
    letra.push_back( rand() % (90-65+1) + 65 ); // A 65, Z 90
    dni = s.str() + letra;
    nombre = list_nombre[ rand() % NUM_NOMBRE];
    apellidos = list_apellido[ rand() % NUM_NOMBRE];
    telefono = rand() % 100000000 + 600000000;
}

/**
 * Escribe el alumno en un stream de salida
 * @param out Stream de salida
 * @param alu alumno a escribir
 */
ostream & operator<<(ostream & out, const Alumno & alu)
{
    const string tab = "    ";
    out << "==================================" << endl;
    out << tab << "DNI: " << alu.dni << endl;
    out << tab << "Nombre: " << alu.nombre << tab << alu.apellidos << endl;;
    out << tab << "Curso: " << alu.curso;
    out << tab << "Telefono: " << alu.telefono << endl;
    out << "==================================" << endl;
    return out;
}
main() :

codice:
int main()
{
    ABB arbol;
    int i = 0;
    string dni;
    Alumno al_aux;

    for (int i=0; i<1000; i++){
        Alumno al_aux(rand());
        arbol.insertar(al_aux.getDNI(),al_aux);
    }

    arbol.inorden(cout);
    cout << endl;
}
il metodo inorden oltre a scorrere l'albero secondo una scansione inorder ... lo stampa ordinato.