我有一个树结构,我需要重新排列(拖放),然后提交更改。
捕获变化的最佳方法是什么?我认为有两种方法,
1似乎最容易实现,尽管如果发生了许多重复操作(即将节点拖动多次,但将它们放回原点),这可能会非常浪费。
2避免了上述问题,但是如何“区分”树来计算父母更改命令要执行的内容?想必有算法吗?
编辑为了澄清,每个节点都有一个“id”和一个“parentId”。我需要允许用户重新排列树(从而改变某些节点的parentId)。
对于选项2,如果它足够简单,只需序列化已更改的树,然后计算差异,按预先顺序迭代原始树,在新树中找到相同的节点,如果父项是,则记录更改不同?这是一种不会陷入循环的稳健方法吗?
编辑实际上没有,那不行。我需要按预先的顺序遍历NEW树,然后在旧树中找到相应的节点,然后对父节点ID进行差异等。
由于
答案 0 :(得分:1)
除非树很大,否则简单地删除旧树然后添加新树可能是最容易的。
当允许的操作包括移动,删除,添加时,将两棵树区分开来会更加复杂,因此除非获得显着的好处,否则最好避免这种复杂性并使用简单的remove-then-add选项
答案 1 :(得分:0)
我会说,我按照下面的算法更改森林变化,为什么我指的是forst,因为在基于gui的常规场景中,树可以有数字。我不知道这是否适用于您的情况,但我的情况是有效的。
可能有场景
1-子女已添加到父母(通过拖放)
2-父母加入儿童(按拖放)
3-一棵树搬到另一棵树上。 (通过合并根节点)(这可能不适用于您的方案)
从实现的角度来看,我使用C#作为我的语言。
我对问题的处理方法
1-创建一个代表树的内存结构 2-当用户移动节点时,更改父ID(必须检查它是否导致循环)
3-重新创建树,以便始终更新内存表示。
4-接受内存表示并保存。
所以在我的实现点中,没有3是至关重要的,因为我总是在我的记忆中保存最新的树。