2010-12-01 1 views
3

У меня есть древовидная структура, которую мне нужно переставить (перетащить), а затем отправить изменения.Как я могу определить два дерева для определения родительских изменений?

Что будет лучшим способом захвата изменений? Как я вижу это есть два способа,

  1. магазин каждая команда изменение, представить список изменений затем выполнить каждый
  2. сериализовать дерево, а затем дифф нового дерева со старым деревом, чтобы работать вне Что изменились , а затем выполнить изменения

1 кажется простым в реализации, хотя это может быть очень расточительно, если многие повторяющиеся действия произошли (т.е. перетаскивая узлы вокруг много раз, но положить их туда, где они начали)

2 избегает вышеуказанных пр. oblem, но как я могу «разбить» деревья, чтобы определить, какие команды родительских изменений выполнить? Предположительно, есть алгоритмы для этого?

Редактировать Чтобы уточнить, каждый узел имеет «id» и «parentId». Мне нужно разрешить пользователям изменять порядок дерева (тем самым изменяя parentId некоторых узлов).

Для варианта 2, если он достаточно прост, чтобы просто сериализовать измененное дерево, а затем выполнить разницу между исходным деревом в предварительном порядке, найти тот же узел в новом дереве и записать изменение, если родители разные? это надежный подход, который не зацикливается на цикле?

Редактировать Фактически нет, это не будет работать. Мне нужно перебрать новое дерево в предзаказе и найти соответствующий узел в старом дереве, дифф родительских идентификаторов и т.д ..

Благодарности

+0

переупорядочить, вы хотите изменить структуру дерева, сохраняя узлы такими же? – Srikanth 2010-12-01 18:01:42

ответ

1

Если деревья не огромны, может быть проще всего просто удалить старое дерево, а затем добавить новое дерево.

Различия в двух деревьях, когда разрешенные операции включают в себя перемещение, удаление, добавление будет намного сложнее, поэтому, если не будет достигнута значительная выгода, вероятно, лучше избегать этой сложности и использовать простой remove-then-add вариант.

0

Я бы сказал, я следую ниже алгоритму лес изменяет изменения почему я имею в виду forst, потому что в обычных сценариях на основе gui может быть число для деревьев. я не знаю, применимо ли это к вашему сценарию или нет, но для меня это действительно.

Там может быть сценарии

1 Ребенок Добавлено Родителя (перетаскивание & Капли)

2- Родителя добавлен к ребенку (перетаскивание & Капли)

3- одно дерева переехало другое дерево. (Объединив корневые узлы) (это может быть неприменимо в вашем сценарии)

для реализации точки зрения, я использовал C# в качестве своего языка.

Мой подход к проблеме

1- Создайте в памяти структуру, которая представляет собой дерево
2- Когда пользователь перемещает узел изменить родительский идентификатор (Check должен быть сделан, что это не приводит к цикл)

3- Повторно создать дерево, чтобы в представлении памяти всегда обновлялось.

4- взять представление памяти и сохранить.

поэтому в моей точке реализации нет 3 имеет решающее значение, поскольку я всегда держу последнее дерево в своей памяти.

Смежные вопросы