Модифицированный обход дерева предзаказа - поиск следующего узла

0

У меня есть эти данные:

id | parent_id | lft | rgt | name
=====================================
1  | 0         | 1   | 8   | abc
2  | 3         | 5   | 6   | jkl
3  | 1         | 2   | 3   | def
4  | 0         | 9   | 10  | mnno
5  | 1         | 4   | 7   | ghi

Мне нужно пройти эту иерархию в этом порядке (ids): 1 > 3 > 5 > 2 > 4

Как я могу это достичь?

Предположим, что я хочу найти следующий node узла_x.

if (node_x_rgt - node_x_lft == 1) {
    next_node_lft = node_x_rgt + 1;
} else {
    next_node_lft = node_x_lft + 1;
}

Эта формула работает только в некоторых случаях (node ids 1,3,5,2). Следующий node из node 2 должен быть 4.

  • 0
    Привет, Пондидум. Я обновил вопрос.
Теги:
algorithm
mptt

1 ответ

0
Лучший ответ

С информацией, которую вы дали, я могу посоветовать:

select * from table order by id

btw, столбцы lft и rgt для id 4 находятся вне дерева, выглядит как ошибка?

btw2, если это домашнее задание, отметьте его как таковое.

Изменить: версия 2 вопроса:

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

select * from table order by lft
  • 0
    Спасибо RSP. На самом деле, да ID 4 это отдельное дерево. Идентификатор 2 является последним узлом дерева с идентификатором узла 1. Если я запрашиваю следующий узел с идентификатором 2, он должен дать мне первый узел следующего дерева (дерево с идентификатором узла 4).
  • 0
    Как упорядочение по id может помочь мне? И это тоже не домашнее задание :)
Показать ещё 7 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню