日期:2014-05-18  浏览次数:20600 次

请教一个递归算法问题
在数据库中,有如下一张表
dwdm         dwmc                         sjdwdm
1             1单位                             0
2             2号单位                         1
3             3号单位                         1
4             2号下级单位                 2
5             3号下级单位                 3
6             2号下级单位子单位     4
~~~~~~~~~~~~~~
就这样无限的分下去
从表中看出,我们的根节点是   dwdm为1。
那么,我想请教各位,如何获得软件登录单位下的所有单位。
请各位指教~

------解决方案--------------------
建议加一个字符型编码字段
dwdm dwmc sjdwdm 编码
1 1单位 0 1
2 2号单位 1 12
3 3号单位 1 13
4 2号下级单位 2 124
5 3号下级单位 3 135
6 2号下级单位子单位 4 1246

对编码字段用LIKE操作符,很容易得到各级子单位
------解决方案--------------------
建议加一个字符型编码字段
dwdm dwmc sjdwdm 编码
1 1单位 0 1
2 2号单位 1 12
3 3号单位 1 13
.....
100 100单位 1 这里怎么表示???如何与其他区分?

n 2号下级单位 2 124


楼上方法不好把。如果数量巨大,你怎么编码



------解决方案--------------------
public void InitDW(string strDWPID,ref DataTable dtData,ref DataTable dtObject)
{
foreach (DataRow dr in dtData.Rows)
{
if (dr[ "dwdm "].ToString().Trim() == strDWPID)
{
DataRow drObject = dtObject.NewRow();
dr.ItemArray.CopyTo(drObject.ItemArray);
dtObject.Rows.Add(drObject);
drObject.AcceptChanges;
InitDW(dr[ "sjdwdm "].ToString().Trim(),ref dtData,ref dtObject);
}
}
}

dtData :将你的所有数据读出来形成一个DataTable
dtObject :将你读取出来的表copy个副本,清空数据

调用时 需要InitDW( "1 ",ref dtData,ref dtObject)


我就手写了一个 没有数据也没有测试阿
------解决方案--------------------


递归算法

//id是父结点编号 (如果需要生成树的话,传参数加个node类型)
Private GetChild (Int ID)
{
select * from 表 where 父结点编号(sjdwdm) = ID
将数据集放在dataset中,
if (ds.tables[0].Rows.Count== 0)
{
return;
}
for (i = 0 ; i <= ds.tables[0].Rows.Count -1 ; i++)
{
//递归
Private GetChild (ds.tables[0].Rows[i][ "dwdm "]);
//定义node,进行绑定,或者返回东西之类
}

}


以上只是个基本框架,lz填充把

如果追求效率,lz可以把select 部分换成dataView过滤,传值的时候,加个dataView就可以
这样可以只select一次,内存中递归查找
------解决方案--------------------
不会 帮顶
------解决方案--------------------
那就只能遍历了