题目原型:
有一张标准的树状结构表,里面有Structure_Id和 Parent_Id两个关键列,记录了结点的父子关系。现在要求添加一个字段为 Structure_Code ,标记为 三位一个节点关系,比如 第一级的为 001,002,第二级的为 001 001 , 001 002等,以此类推。
现在添加了这样一列:
想要的是这样的:
为什么要这样的东西呢?因为这列中可以描述:它的父亲是谁,爷爷是谁,太爷爷是谁,祖先是谁,当然也可以描述它的所有孩子有哪些,是居家必备,出门旅行的好东西啊!!!做树状设计时强烈推荐。
那么如何处理呢??这是个算法问题,请大家自行设计一下,我们对比一下执行效率。我的答案是5K条左右的数据,共需0.5秒。如果你的算法更优,请告诉我。
我的思路,不要先看啊,请自行设计一下。
解决思路: 1、定义一个NodeBean,包括Structure_ID,Parent_ID,Structure_Code,Child_Count四个属性 2、创建一个数据结构var dict=new Dictionary<String, NodeBean>(); 3、采用DataAdapter一次性将整表读入到内存,存放到dict中。 4、初始化根结点:查询所有根结点,然后按Stucture_ID做为Key,查询到dict中的此实例,然后把对应的NodeBean四个属性分别给定值,Parent_ID=11111-1111-1111-1111,Child_Count=0,Sturcture_Code分别为 001,002,003... 020等。 5、定义一个栈,FILO的东西,http://blog.csdn.net/aladdinty/article/details/3506285 Stack<string> stack = new Stack<string>(); 这个栈用来装需要马上找到父亲的节点。 6、遍历dict,找到第一条记录对应的Structure_Code,如果是空的,那么表示需要填充值,添加到上面定义好的栈里。 7、查找到对应的Parent_ID,然后拿此Parent_ID为KEY去dict中查找上一级节点对应的Structure_Code, 8、如果找到了,那么就可以更改父节点的,Child_Count++,表示又有一个孩子回家了。把父亲的Structure_Code放在前面,后面根据Child_Count记录001,002,003 9、如果还是没有找到,那么继续加入到定义好的栈里。 10、循环检查栈里面是不是有东西,有的话,遍历每一个,因为特殊的数据结构栈,所以是FILO的,就是先进后出,这样就把爷爷结点先和太爷爷结点建立起了关系,把它移除,然后处理父亲,最后处理孩子的。 OK,至此这个Dictionary整理完成,我们重新组装成SQL,一次性事务提交到数据库即可了。