在两个二叉树中计数相等的节点

时间:2019-06-30 22:55:09

标签: c++ binary-tree nodes

我有下一个问题,但我解决不了:/

  

有两棵二叉树,对称排列   英语课程和法语课程的另一棵树。每棵树都有   以下数据:身份和学生的名字每棵树   包含注册那些课程的学生。一个学生可以存在   在登记的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;
}

1 个答案:

答案 0 :(得分:0)

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

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

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

情况1:树不是二叉搜索树

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

案例2:树是二叉搜索树

  • 时间复杂度:O(m * log(n))
  • 空间复杂度:O(1)

更好的解决方案如下(w.r.t Time):

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

  • 时间复杂度:O(m + n)

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

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