我有下一个问题,但我解决不了:/
有两棵二叉树,对称排列 英语课程和法语课程的另一棵树。每棵树都有 以下数据:身份和学生的名字每棵树 包含注册那些课程的学生。一个学生可以存在 在登记的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;
}
答案 0 :(得分:0)
解决此问题的通用算法是:
但是这个问题有两个方面:
情况1:树不是二叉搜索树
案例2:树是二叉搜索树
更好的解决方案如下(w.r.t Time):
相应地增加计数器。
时间复杂度:O(m + n)
其中,m和n分别是Tree-1和Tree-2的大小。