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