版权声明:可以任意转载,转载时请务必以超链接形式标明如下文章原始出处和作者信息及本声明
作者:xixi
出处:http://blog.youkuaiyun.com/slowgrace/archive/2008/12/16/3528636.aspx
1、几个概念
现在设计的树允许具有相同细节的节点在多个位置挂着,甚至可以挂在多棵树上,称这种节点为多挂节点。对一个多挂节点,它的在其他位置挂着的相同细节的同类,称为它的同挂。同挂又分为同树同挂和异树同挂。所谓同树同挂,是指挂在同一节点表下的具有相同细节ID的节点;所谓异树同挂,是指挂在同一节点表下的具有相同细节ID的节点。多挂节点的引入会导致多树联动问题,也就是当改动了一个节点时(比如改它的名字、拖拽改变它的位置、删除它、改动它的细节等),需要同时考虑它的同挂是否同时变动的问题。如果用户希望只改动当前节点,而不改动它的同挂,那我们就称这种改动为节点独改;如果用户希望只改动所有同树同挂,而不改动异树同挂,那我们就称这种改动为同树独改;如果用户希望所有同挂都改,那我们就称这种改动为同挂全改。
2、解决多树联动问题的一般思路
有了上面这些概念,实际上我们解决多树联动问题的思路也就比较清晰了。当用户对一个节点作出改动的时候,可以分如下几种情况分别处理:
(1)非多挂节点
很简单,改它自己就好了。注意有时只需要改动节点表里的值,有时需要同时改动节点表和细节表的值。
(2)多挂节点-节点独改
这时候,实际上我们需要把当前这个节点从它的同挂集合中拆分出来:
a)造一个和原来细节一模一样的新细节,除了改动的部分用新值以及多挂计数用1外;
b)原来的同挂多挂计数都减一,也就是细节表里bytRef字段减1
c)改本节点:节点表上改本节点的细节ID,另外做其他的相应变动(可能涉及树控件)。
(3)多挂节点-同树独改
这也同样涉及细节记录的拆分,所不同的是,这时需要监视拆分后原细节的多挂计数是否变为0。如果多挂计数变为0的话,就需要把原细节删了;同样同树的同挂的多挂计数也需要重新计算,而不是像节点独改那样简单设为1。
a)造一个和原来细节一模一样的新细节,除了改动的部分用新值以及多挂计数用同挂节点数外;
b)改所有异树同挂的多挂计数(等于原来的多挂计数减去同树同挂计数):改细节表的多挂计数字段,如果值为0,则删该记录。
c)改本节点的所有同树同挂(包括自己):节点表上相应节点的细节ID字段,另外做其他的相应变动(可能涉及树控件)。
(4)多挂节点-同挂全改
这也比较简单。就在节点表、细节表、树控件上对所有同挂(包括自己)做相应变动就OK了。
更多树类文章
本文介绍了在树型数据结构中处理多挂节点的概念及其联动问题。针对不同用户需求(如节点独改、同树独改、同挂全改),提出了详细的解决方案和技术实现思路。
1083

被折叠的 条评论
为什么被折叠?



