private No insere(No h, Chave chave, Valor valor, int ht) {
        int j;
        Entrada t = new Entrada(chave, valor, null);

        // no externo
        if (ht == 0) {
            for (j = 0; j < h.numFilhos; j++) {
                if (menor(chave, h.filhos[j].chave)) break;
            }
        }

        // no interno
        else {
            for (j = 0; j < h.numFilhos; j++) {
                if ((j+1 == h.numFilhos) || menor(chave, h.filhos[j+1].chave)) {
                    No u = insere(h.filhos[j++].proximo, chave, valor, ht-1);
                    if (u == null) return null;
                    t.chave = u.filhos[0].chave;
                    t.proximo = u;
                    break;
                }
            }
        }

        for (int i = h.numFilhos; i > j; i--) h.filhos[i] = h.filhos[i-1];
        h.filhos[j] = t;
        h.numFilhos++;
        if (h.numFilhos < numMaximoFilhos) return null;
        else         return cisao(h);
    }