powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Перестроение заново индексов NestedSet
8 сообщений из 8, страница 1 из 1
Перестроение заново индексов NestedSet
    #37149947
unicornmirage
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет.
Использую в своей БД хранение деревьев через NestedSet, но кроме того в каждом узле дополнительно сохраняю ссылку на parent и ссылку на root. Тоесть модель такая:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Node {
    nodeId,
    parentNodeId,
    rootNodeId,
    leftIndex,
    rightIndex,
    level
}

Кроме того я не использую единое глобальное дерево, а оно у меня разбито на многие мелкие деревья. Для них соответственно Node.rootNodeId == NULL.

Так вот, я хочу реализовать перестроение индексов, для таких ситуаций, когда например индексы (leftIndex, rightIndex) "поломались", и осталась только информация (nodeId, parentNodeId, rootNodeId). как это сделать - в голову приходит вариант с рекурсией, но как то слишком сложно подойти к алгоритму... Подскажите, как проще подойти к этому решению?
...
Рейтинг: 0 / 0
Перестроение заново индексов NestedSet
    #37149969
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что такое "мелкие деревья"? И чему равны левые-правые индексы?
...
Рейтинг: 0 / 0
Перестроение заново индексов NestedSet
    #37149980
unicornmirage
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlА что такое "мелкие деревья"? И чему равны левые-правые индексы?

мелкие деревья, имеется ввиду - в базе несколько деревьев, т.е. с логической точки зрения поддеревья выделены в отдельные деревья без общего корня root.

левые и правые индексы - хранят нумерацию согласно алгоритму NestedSet.
( http://www.getinfo.ru/article610.html
...
Рейтинг: 0 / 0
Перестроение заново индексов NestedSet
    #37150074
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Рекурсия тут будет проще всего.
...
Рейтинг: 0 / 0
Перестроение заново индексов NestedSet
    #37150081
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
примерно так:
Код: plaintext
1.
2.
3.
4.
5.
int setIndexs( node n, int int incomingIndex) {
   n.leftIndex = incomingIndex;
   int idx = setIndexes( n.leftChild, incomingIndex+ 1 );
   n.rightIndex = setIndexes( n.rightChild, idx+ 1 );
   return n.rightIndex+ 1 ;
}
...
Рейтинг: 0 / 0
Перестроение заново индексов NestedSet
    #37150097
unicornmirage
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl,

а что такое n.leftChild, n.rightChild? Это случайно не крайние дочерние элементы? Если например есть узел, у которого три дочерних узла одного уровня:

n1 -- {n1_1, n1_2, n1_3)

то

n.leftChild будет равен n1_1 , а n.rightChild будет равен n1_3 ?
...
Рейтинг: 0 / 0
Перестроение заново индексов NestedSet
    #37150162
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
unicornmirageWhite Owl,

а что такое n.leftChild, n.rightChild? Это случайно не крайние дочерние элементы? Если например есть узел, у которого три дочерних узла одного уровня:

n1 -- {n1_1, n1_2, n1_3)

то

n.leftChild будет равен n1_1 , а n.rightChild будет равен n1_3 ?Угу...
Впрочем, если нода своих детей не знает, то можно сделать примерно так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
int setIndexs( node n, int int incomingIndex) {
   n.leftIndex = incomingIndex;
   int idx = n.leftIndex;
   
   SomeArray children = getAllChildren ( n.nodeId );

   foreach (Node child, children) {
      idx = setIndexes( child, idx+ 1 );
   }
   n.rightIndex = idx+ 1 ;
   return n.rightIndex;
}
...
Рейтинг: 0 / 0
Перестроение заново индексов NestedSet
    #37152123
unicornmirage
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl,

Большое спасибо за пример алгоритма! Теперь уже вырисовывается общая картина.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Перестроение заново индексов NestedSet
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]