se non ho capito male i padri non possono essere figli a loro volta, se è cosi le cose si semplificano parecchio.
La tua struttura dati è una lista di oggetti persona che sono i padri che oltre ai connotati ha anche una proprieta elenco figli List<Persona>.
codice:
public class Persona {
public int ID {get;set;}
public string Nome {get;set;}
//altre props
public List<Persona> Figli {get;set}
public Persona()
{
Figli = new List<Persona>();
}
}
codice:
public List<Persona> GeneraAlbero()
{
public List<Persona> albero = new List<Persona>();
//Seleziona dal DB tutti i padri (quelli con id=0)
//Aggiungi i padri alla lista albero
foreach(Persona padre in albero)
{
// seleziona tutte le persone dal db che hanno come idPadre l'id di padre
//Aggiungi i figli selezionati alla lista padre.Figli
}
return albero;
}
Se invece i padri possono a loro volta essere figli la funzione generaAlbero la devi fare ricorsiva, gli devi passare l'id del padre (0 quando la chiami per la prima volta) e poi richiamarla dentro il foreach.