Crear la tabla de contenido de un libro

propuesto por josejuan

Alguien ha perdido los números de índice de cada contenido de un libro ¿serás capaz de reconstruirlo?.

Enunciado
En un libro, los diferentes contenidos están clasificados por su importancia, así por ejemplo, podemos tener lo siguiente:

1. Introducción
   1.1. Motivación
   1.2. Reseña histórica
        1.2.1. Origen
        1.2.2. Trabajos preliminares
   1.3. Soluciones actuales
   1.4. Objetivo de este libro
2. Requisitos
   2.1. Hardware
   2.2. Software
etc...


Actualmente, disponemos de una función que imprime la tabla de contenidos, pero que requiere que se le indiquen los contenidos agrupados en un árbol (los elementos del primer nivel y dentro de cada uno de ellos sus hijos y así sucesivamente).

En el ejemplo, en formato JSON (pero puedes usar tu propio tipo de dato para almacenar el árbol generado), nuestra función requiere que se le pasen los apartados como:
apartados = [ { titulo: "Introducción"
              , hijos: [ { titulo: "Motivación", hijos: [] }
                       , { titulo: "Reseña histórica"
                         , hijos: [ { titulo: "Origen", hijos: [] }
                                  , { titulo: "Trabajos preliminares", hijos: [] }
                                  ]
                         }
                       , { titulo: "Soluciones actuales", hijos: [] }
                       , { titulo: "Objetivo de este libro", hijos: [] }
                       ]
              }
            , { titulo: "Requisitos"
              , hijos: [ { titulo: "Hardware", hijos: [] }
                       , { titulo: "Software", hijos: [] }
                       ...
                       ]
              }
            ];


Pero resulta que a ti te dan los contenidos directamente como los ha escrito el autor (en orden) y sólo dispones del título del apartado y del nivel en el que se encuentra. Es decir, el autor realmente escribe
<h1>Introducción</h1>
...
<h2>Motivación</h2>
...
<h2>Reseña histórica</h2>
...
<h3>Origen</h3>
...
<h3>Trabajos preliminares</h3>
...
<h2>Soluciones actuales</h2>
...
<h2>Objetivo de este libro</h2>
...


Por lo que a ti sólo se te da una única lista ordenada con el título y el nivel del contenido. Por ejemplo:
apartados = [ { titulo: "Introducción", nivel: 1 }
            , { titulo: "Motivación", nivel: 2 }
            , { titulo: "Reseña histórica", nivel: 2 }
            , { titulo: "Origen", nivel: 3 }
            , { titulo: "Trabajos preliminares", nivel: 3 }
            , { titulo: "Soluciones actuales", nivel: 2 }
            , { titulo: "Objetivo de este libro", nivel: 2 }
            , { titulo: "Requisitos", nivel: 1 }
            , { titulo: "Hardware", nivel: 2 }
            , { titulo: "Software", nivel: 2 }
              ...
            ];


Entonces, tu objetivo es escribir una función que convierta esta última representación en la primera con forma de árbol.

Ver todo el enunciado

Preguntas sobre el desafío

¿Tienes dudas sobre el desafío? plantéala aquí

Plantea tu pregunta

5 Soluciones

Dar mi solución

Dar mi solución