Il dataset era solo una possibile soluzione, la prima che mi è venuta in mente. In sostanza ti fai la query sulla tabella dove c'è la struttura gerarchica, setti le relazioni sul dataset e poi bind al treeview
codice:
string cmd = "select * from table";
SqlDataAdapter mySqlDataAdapter = new SqlDataAdapter(cmd, connection);
mioDataSet = new DataSet();
mioSqlDataAdapter.Fill(mioDataSet,"NomeTabella")
//Crei la relazione Padre/figlio
DataColumn colIdFiglio = mioDataSet .Tables["NomeTabella"].Columns["ID_FIGLIO"];
DataColumn colIdPadre = mioDataSet .Tables["NomeTabella"].Columns["ID_PADRE"];
DataRelation r = mioDataSet .Relations.Add(colIdFiglio, colIdPadre);
r.Nested = true;
//Bind sul controllo treeview