Я бы использовал уровни связанных списков.
message1
message2
message3
message4
message5
message6
message7
Каждый узел будет иметь указатель на его:
- forward sibling (2->5, 3->4, 5->6, 1/4/6/7->NULL).
- backward sibling (4->3, 5->2, 6->5, 1/2/3/7->NULL).
- first child (1->2, 2->3, 6->7, 3/4/5/7->NULL).
- parent (2->1, 3->2, 4->2, 5->1, 6->1, 7->6, 1->NULL).
На каждом уровне сообщения сортируются в списке по количеству голосов (или любым другим показателям, которые вы хотите использовать).
Это дало бы вам максимальную гибкость для перемещения вещей, и вы могли бы перемещать целые поддеревья (например, message2
), просто изменяя ссылки на родительском и этом уровне.
Например, скажем, message6
получает приток голосов, что делает его более популярным, чем message5
. Изменения (корректировка указателей на следующий и предыдущий элементы):
message2 -> message6
message6 -> message5
message5 -> NULL
.
чтобы получить:
message1
message2
message3
message4
message6
message7
message5
Если он продолжается до тех пор, пока не наберет больше голосов, чем message2
, произойдет следующее:
message6 -> message2
message2 -> message5
И указатель первого ребенка message1
установлен на message6
(это было message2
), но все еще относительно легко получить:
message1
message6
message7
message2
message3
message4
message5
Переупорядочение необходимо только в том случае, если изменение оценки приводит к тому, что сообщение становится больше, чем его верхний брат или младший брат. Вам не нужно менять порядок после каждого изменения счета.