Ładny i uniwersalny sposób konwertowania listy elementów na drzewo

Mam listę kategorii:

╔════╦═════════════╦═════════════╗
║ Id ║ Name        ║ Parent_id   ║
╠════╬═════════════╬═════════════╣
║ 1  ║ Sports      ║ 0           ║
║ 2  ║ Balls       ║ 1           ║
║ 3  ║ Shoes       ║ 1           ║
║ 4  ║ Electronics ║ 0           ║
║ 5  ║ Cameras     ║ 4           ║
║ 6  ║ Lenses      ║ 5           ║
║ 7  ║ Tripod      ║ 5           ║
║ 8  ║ Computers   ║ 4           ║
║ 9  ║ Laptops     ║ 8           ║
║ 10 ║ Empty       ║ 0           ║
║ -1 ║ Broken      ║ 999         ║
╚════╩═════════════╩═════════════╝ 

Każda kategoria ma rodzica. Gdy rodzic ma wartość 0 - oznacza to, że jest to kategoria główna.

Co jestnajmilszy sposób przekształcić go w strukturę drzewa, jak poniżej?

Innymi słowy - jak przynieść dane z tej struktury:

class category
{
    public int Id;
    public int ParentId;
    public string Name;
}

Do tego:

class category
{
    public int Id;
    public int ParentId;
    public string Name;

    public List<Category> Subcategories;
}

w uniwersalny sposób?// Uniwersalny oznacza nie tylko dla wspomnianej klasy.

Czy masz jakieś sprytne pomysły? ;)

Dane:

var categories = new List<category>() {
    new category(1, "Sport", 0),
    new category(2, "Balls", 1),
    new category(3, "Shoes", 1),
    new category(4, "Electronics", 0),
    new category(5, "Cameras", 4),
    new category(6, "Lenses", 5),  
    new category(7, "Tripod", 5), 
    new category(8, "Computers", 4),
    new category(9, "Laptops", 8),
    new category(10, "Empty", 0),
    new category(-1, "Broken", 999),
};

questionAnswers(7)

yourAnswerToTheQuestion