Дерево без рекурсии
Есть задача реализовать вывод обычного дерева, но делать это без рекурсии...
Как-то это возможно сделать?
http://en.wikipedia.org/wiki/Tree_traversal#Iterative_Traversal
http://en.wikipedia.org/wiki/Breadth-first_search
как сказали выше, обычно используется стек для хранения уже пройденных вершин - это будет как бы эмуляция рекурсии...
второй вариант - у каждой ветки есть свой ключ, который означает побывал ты в ней или нет.. после этого спуск по дереву с отметкой вершин, потом второй цикл вывода...
если хранить вместе с указателем на родителя ещё и число, на каком уровне от корня этот элемент, то будет попроще
но самый удобный и хороший вариант, правда линк сейчас не найду, когда дерево организуется так, что вместо указателя на родителя все элементы имеют указатели на предыдущий и следующий элемент, а номера им распределяют сверху вниз слева направо как-то так:
___0___
__1__8__
_2_5....
3_46_7....
где-то пару лет назад на этом же форуме этот метод уже описывали)) правда вставка в такое дерево, если, например, оно хранится в базе, потребует обновить индексы всех полей после него..
select * from `mydb`.`mytable` p0
left join `mydb`.`mytable` p1 on p0.Id = p1.parent_id
left join `mydb`.`mytable` p2 on p1.Id = p2.parent_id
...
left join `mydb`.`mytable` p(N) on p(N-1).Id = p(N).parent_id
where ...;
Индексы желательно не менять.
А можно простой пример кода?
Потому-что я что-то слабо представляю как в PHP при помощи стэка без рекурсии можно вывести структуру в виде дерева...
http://forum.codenet.ru/threads/47998-%D0%A0%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85?p=245743&viewfull=1#post245743
Спасибо, но мне бы именно PHP, сейчас времени с кодом билдера разбираться нету...
Кстати уровень вложенности неограничен.
Кстати уровень вложенности неограничен.
ну шо тут сказать... нет так нет...
даю подсказку: в билдере реализованно на ассоциативных массивах, где ключ - ID записи, значение - узел дерева
даю подсказку: в билдере реализованно на ассоциативных массивах, где ключ - ID записи, значение - узел дерева
А примерный код набросать не можете?
но самый удобный и хороший вариант, правда линк сейчас не найду, когда дерево организуется так, что вместо указателя на родителя все элементы имеют указатели на предыдущий и следующий элемент, а номера им распределяют сверху вниз слева направо как-то так:
___0___
__1__8__
_2_5....
3_46_7....
Судя по описание речь о Nested Set.
Есть задача реализовать вывод обычного дерева, но делать это без рекурсии...
Как-то это возможно сделать?
На выбор: Способы хранения деревьев в базах данных, выбрав понравившийся алгоритм можно искать реализацию в виде готовой библиотеки, коих достаточно.
да, оно))
http://www.sitepoint.com/hierarchical-data-database-2/ вот с примером по нему на PHP
http://stackoverflow.com/questions/2094207/php-traversing-function-to-turn-single-array-into-nested-array-with-children-ba/ - вот здесь код, как структуру из обычного id->parent преобразовать во вложенную без рекурсии... а её обойти уже можно тоже без рекурсии, например так: http://stackoverflow.com/questions/3096792/the-most-elegant-way-to-walk-trees-in-php
А какой должна быть структура таблицы, чтобы можно было по корневым элементам выбрать все подветки одним запросом?
SELECT * FROM tree WHERE lft BETWEEN 2 AND 11 ORDER BY lft ASC;
где 2 и 11 собственно lft и rgt вершины))
укажем 0 и last - получим всё дерево