在两棵二元树中计数相等的节点

Count equal nodes in two binary trees

本文关键字:节点 二元 两棵      更新时间:2023-10-16

我已经解决了下一个问题,我无法解决:/

有两棵二进制树,对称地排列了一棵树 英语课程和另一棵法语课程。每棵树都有 以下数据:身份证明和学生的名字,每棵树 包含参加这些课程的学生。学生可以存在 在注册的两棵树中。要求制作一个函数 返回参加这两个课程的学生人数(这是 是,它们出现在两棵树中(

我该如何解决?

我使用两棵树的搜索功能制作了下一个代码

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;
}

解决此问题的通用算法是:

  • 从Tree-1中选择一个元素,然后在Tree-2中搜索。
  • 维护所有平等元素的计数器。

但是这个问题有两个方面:

情况1:树不是二进制搜索树

  • 时间复杂性:O(m*n(
  • 空间复杂性:O(1(

案例2:树是二进制搜索树

  • 时间复杂性:O(M*log(n((
  • 空间复杂性:O(1(

一个更好的解决方案是如下(W.R.T时间(:

  • 遍历较小的树,说树-1并将其元素存储在地图中。
  • 穿越较大的树并搜索地图中存在的元素
  • 相应地增加计数器。

  • 时间复杂性:O(M N(

  • 空间复杂性:O(min(m,n((

其中,m和n分别是树-1和树-2的大小。