La primera opción la imagino así:
   Código PHP:
    <?php
$rs1 = mysql_query("select * from carpetas order by id_carpeta ASC") or die (mysql_error());
while($row1 = mysql_fetch_assoc($rs1, MYSQL_ASSOC)){
         $id_carpeta = $row1['id_carpeta'];
         echo "<li>".$row1['nombre_carpeta']."</li>";
         //hago consulta consulta para buscar los archivos en raiz
         $rs2 = mysql_query("select * from archivos where id_carpeta='$id_carpeta' and id_subcarpeta='0'"); //si es 0 significa que esta en raiz
         while($row2 = mysql_fetch_assoc($rs2, MYSQL_ASSOC)){
                   echo "<li>".$row2['nombre_archivo']."</li>";
         }
         echo "<ul>";
            //hago consulta para listar las subcarpetas
            $rs3 = mysql_query("select * from archivos_raiz where id_carpeta='$id_carpeta'");
            while($row3 = mysql_fetch_assoc($rs3, MYSQL_ASSOC)){
                   $id_sub_carpeta = $row1['id_sub_carpeta'];
                   
                   //buscamos aver si tiene algo XD
                   $rsBuscar = mysql_query("select * from archivos where id_carpeta='$id_carpeta' and id_subcarpeta='$id_sub_carpeta'");
                   $total_rsBuscar = mysql_num_rows($rsBuscar);
                   //si existe continuamos
                   if($total_rsBuscar>0){
                           
                   echo "<li>".$row3['nombre_subcarpeta']."</li>";
                   //hago consulta para listar archivos dentro de las subcarpetas
                   echo "<ul>";
                      $rs4 = mysql_query("select * from archivos where id_carpeta='$id_carpeta' and id_subcarpeta='$id_sub_carpeta'");
                      while($row4 = mysql_fetch_assoc($rs4, MYSQL_ASSOC)){
                              echo "<li>".$row4['nombre_archivo']."</li>";
                   }
                   echo "</ul>";
                   
                   }//fin del if
            }
         echo "</ul>";        
}
?>