У меня следующая проблема, и я не могу ее решить: /
Есть два двоичных дерева, расположенных симметрично. Одно дерево
Курс английского и еще одно дерево курса французского. Каждое дерево имеет
следующие данные: идентификация и имя студента каждое дерево
содержит студентов, зачисленных на эти курсы. Студент может существовать
на 2х деревьях зачислены. Требуется сделать функцию, которая
возвращает количество студентов, обучающихся на обоих курсах (что
есть, они появляются на двух деревьях)
Как мне это решить?
Я сделал следующий код, используя функцию поиска по двум деревьям
typedef struct Alumno
{
int matricula;
char nombre[30];
}Alumno;
typedef struct NodoA* PuntA;
typedef struct NodoA
{
Alumno TAlumno;
PuntA izq;
PuntA der;
}NodoA;
int buscar(PuntA & aluI, PuntA & aluF)
{
Alumno datoI, datoF;
PuntA r=raizI;
int cont = 0;
while((r!=NULL) && (r->datoI.matricula != aluF->datoF.matricula))
{
if(r->datoI.matricula < aluF->datoF.matricula)
r=r->izq;
else
r=r->der;
}
if(r!=NULL)
cont++;
}
Извините за язык кода.
PS: мне не нужно объединять два двоичных дерева, мне нужно посчитать равные узлы между двумя деревьями.
Edit1: я сделал этот код, переосмыслив упражнение:
int buscar(PuntA raizFrances, int nro)
{
PuntA r=raizFrances;
while(r!=NULL && r->dato!=nro)
{
if(nro<r->dato)
r=r->izq;
else
r=r->der;
}
if(r==NULL)
return 0;
else
return 1;
}
void contarDobles(PuntA raizI) //MUESTRA PIMERO LA RAIZ Y DESPUES IZQUIERDA Y DESPUES DERECHA
{
int contador = 0;
int buscaEnF = 0;
if(raizI!=NULL)
{
listarPre(raizI->izq); //1
buscaEnF = buscar(raizI->dato, raizI->dato.matricula);
if(buscaEnF == 1)
contador++;
listarPre(raizI->der); //2
}
cout<<"El total de alumnos inscriptos en ambas materias es: "<<contador<<endl;
}