private Nodo construir_arbol(ArrayList<ArrayList<Elemento>> listas_elementos, ArrayList<RegistroTD> tabla, List<Elemento> ranking) {
        
        //Creamos el nodo raíz del árbol
        Nodo padre = new Nodo();
        
        for(ArrayList<Elemento> ordenados : listas_elementos){
            Nodo nodo_actual = padre;
            for (Elemento elem : ordenados) {
                //Tenemos que generar una rama de este conjunto
                //Buscamos un hijo del padre que sea igual que el nodo actual

                Nodo nodo_hijo = null;
                for (Nodo h : nodo_actual.getHijos()) {
                    if (elem.equals(h.getElemento())) {
                        nodo_hijo = h;
                    }
                }


                //Si no existe lo añadimos con el nodo actual como padre y frecuencia 0 (en el constructor del nuevo nodo)
                if (nodo_hijo == null) {
                    nodo_hijo = new Nodo(elem, nodo_actual);
                    nodo_actual.getHijos().add(nodo_hijo);

                    //Cuando añadimos un nodo nuevo ampliamos la lista enlazada
                    //Añadimos el enlace a la lista del registro correspondiente de la tabla
                    //Buscamos el elemento correspondiente de la lista, usamos el ranking que es una copia para eso
                    int registro = ranking.indexOf(elem);

                    Nodo link = tabla.get(registro).getNodo();

                    //TODO efecto colateral, estamos modificando la tabla que se le pasa además de construir el árbol
                    
                    //Si es el primer nodo lo añadimos directamente
                    if (link == null) {
                        tabla.get(registro).setNodo(nodo_hijo);
                    } else {
                        //Sino tenemos que buscar el último nodo
                        Nodo ultimo = link;
                        while (link != null) {
                            ultimo = link;
                            link = ultimo.getSiguiente();
                        }
                        //En este momento tenemos que link es null y por tanto ultimo es el último nodo de la lista
                        ultimo.setSiguiente(nodo_hijo);
                    }
                }

                //En cualquier caso sumamos uno a la frecuencia del hijo
                nodo_hijo.setFreq(nodo_hijo.getFreq() + 1);



                //Actualizamos el nodo actual al hijo
                nodo_actual = nodo_hijo;
            }



        }
        return padre;
    }