如何区分两棵树以确定父母的变化?

时间:2010-12-01 17:52:34

标签: algorithm data-structures tree

我有一个树结构,我需要重新排列(拖放),然后提交更改。

捕获变化的最佳方法是什么?我认为有两种方法,

  1. 存储每个更改命令,提交更改列表然后执行每个更改
  2. 序列化树,然后使用旧树对新树进行区分,以确定更改后的内容,然后执行更改
  3. 1似乎最容易实现,尽管如果发生了许多重复操作(即将节点拖动多次,但将它们放回原点),这可能会非常浪费。

    2避免了上述问题,但是如何“区分”树来计算父母更改命令要执行的内容?想必有算法吗?

    编辑为了澄清,每个节点都有一个“id”和一个“parentId”。我需要允许用户重新排列树(从而改变某些节点的parentId)。

    对于选项2,如果它足够简单,只需序列化已更改的树,然后计算差异,按预先顺序迭代原始树,在新树中找到相同的节点,如果父项是,则记录更改不同?这是一种不会陷入循环的稳健方法吗?

    编辑实际上没有,那不行。我需要按预先的顺序遍历NEW树,然后在旧树中找到相应的节点,然后对父节点ID进行差异等。

    由于

2 个答案:

答案 0 :(得分:1)

除非树很大,否则简单地删除旧树然后添加新树可能是最容易的。

当允许的操作包括移动,删除,添加时,将两棵树区分开来会更加复杂,因此除非获得显着的好处,否则最好避免这种复杂性并使用简单的remove-then-add选项

答案 1 :(得分:0)

我会说,我按照下面的算法更改森林变化,为什么我指的是forst,因为在基于gui的常规场景中,树可以有数字。我不知道这是否适用于您的情况,但我的情况是有效的。

可能有场景

1-子女已添加到父母(通过拖放)

2-父母加入儿童(按拖放)

3-一棵树搬到另一棵树上。 (通过合并根节点)(这可能不适用于您的方案)

从实现的角度来看,我使用C#作为我的语言。

我对问题的处理方法

1-创建一个代表树的内存结构 2-当用户移动节点时,更改父ID(必须检查它是否导致循环)

3-重新创建树,以便始终更新内存表示。

4-接受内存表示并保存。

所以在我的实现点中,没有3是至关重要的,因为我总是在我的记忆中保存最新的树。