tendrias que tener crear una tabla parecida a esta:
    
Código script:
Ver original- CREATE TABLE DEPARTAMENTO( 
- ID_DEP ....., 
- NOM_DEP ...., 
- ID_PADRE_DEP .... --DONDE ESTE VA A CONTENER EL ID DEL DEPARTAMENTO AL CUAL PERTECNECE 
- PRIMARY KEY(ID_DEP)) 
OJO QUE DEBE TENER UNA CABEZERA!
por ejemplo unos datos : 
('00001','DEPARTAMENTOS','00000') <--- Esta es la cabeza
('00002','PRESIDENCIAL','00001')
('00003','a101','00002')
('00004','a102','00002')
('00005','a103','00002')
('00006','SUITE','00006')
('00007','a201','00006')
('00008','a202','00006')
('00009','a203','00006')
('00010','NORMAL','00001')
('00011','a301','00010')
('00012','a302','00010') 
EL arbol te mostraria algo asi:   
Código script:
Ver original- DEPARTAMENTOS 
-        PRESIDENCIAL 
-                 a101 
-                 a102 
-                 a103 
-        SUITE 
-                 a201 
-                 a202 
-                 a203 
-        NORMAL 
-                 a301 
-                 a302 
y luego se crearia un metodo asi :    
Código c#:
Ver original- public void Carga(string indicePadre, TreeNode nodePadre) 
- { 
- DataTable dtt = objmn.LISTADODEPARTAMENTOS(); 
- DataView dataViewHijos = new DataView(dtt); 
- dataViewHijos.RowFilter = dtt.Columns["ID_PADRE_DEP"].ColumnName + " = " + indicePadre; 
-   
- foreach (DataRowView dataRowCurrent in dataViewHijos) 
- { 
- TreeNode nuevoNodo = new TreeNode(); 
- nuevoNodo.Text = dataRowCurrent["NOM_DEP"].ToString(); 
- if (nodePadre == null) 
- { 
- treeView2.Nodes.Add(nuevoNodo); //se le agrega un nuevo nodo 
- } 
- else 
- { 
- nodePadre.Nodes.Add(nuevoNodo); // sino le agrego nuevos hijos 
- } 
- Carga(Int32.Parse(dataRowCurrent["ID_DEP"].ToString()), nuevoNodo); 
- } 
- treeView2.ExpandAll(); 
- } 
y finalmente para imprimir el listado se llama asi por ejemplo en tu load    
 
Espero te haya sido util. Saludos! 
