Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Дерево без рекурсии

1.8K
25 июля 2011 года
trivium
128 / / 31.01.2010
Всем привет.
Есть задача реализовать вывод обычного дерева, но делать это без рекурсии...
Как-то это возможно сделать?
369
26 июля 2011 года
Kesano
451 / / 09.10.2007
А какая глубина ветвей?
416
26 июля 2011 года
MaitreDesir
380 / / 02.01.2008
Копай в сторону полиномиального алгоритма обхода. Там, насколько я помню, используется стек для для сохранения не обойдённых вершин, и цикл крутит этот стек, позволяя не используя рекурсию обойти все дерево, за полиномиальное время.
271
26 июля 2011 года
MrXaK
721 / / 31.12.2002
Вообще это ещё зависит от того, в каком виде ты хранишь дерево..
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....
где-то пару лет назад на этом же форуме этот метод уже описывали)) правда вставка в такое дерево, если, например, оно хранится в базе, потребует обновить индексы всех полей после него..
271
26 июля 2011 года
MrXaK
721 / / 31.12.2002
а вообще реально бесконечная глубина не нужна)) на каких-нибудь форумах достаточно нескольких уровней, а это уже можно написать в стиле

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 ...;
1.8K
26 июля 2011 года
trivium
128 / / 31.01.2010
Всё хранится в базе, обычной структуры: id, parent_id, name где parent_id это id родителя.
Индексы желательно не менять.
А можно простой пример кода?
Потому-что я что-то слабо представляю как в PHP при помощи стэка без рекурсии можно вывести структуру в виде дерева...
1.8K
26 июля 2011 года
trivium
128 / / 31.01.2010



Спасибо, но мне бы именно PHP, сейчас времени с кодом билдера разбираться нету...
Кстати уровень вложенности неограничен.

11
26 июля 2011 года
oxotnik333
2.9K / / 03.08.2007
Цитата: trivium
Спасибо, но мне бы именно PHP, сейчас времени с кодом билдера разбираться нету...
Кстати уровень вложенности неограничен.



ну шо тут сказать... нет так нет...
даю подсказку: в билдере реализованно на ассоциативных массивах, где ключ - ID записи, значение - узел дерева

1.8K
26 июля 2011 года
trivium
128 / / 31.01.2010
Цитата: oxotnik333
ну шо тут сказать... нет так нет...
даю подсказку: в билдере реализованно на ассоциативных массивах, где ключ - ID записи, значение - узел дерева



А примерный код набросать не можете?

12
26 июля 2011 года
alekciy
3.0K / / 13.12.2005
Цитата: Mr.Hacker

но самый удобный и хороший вариант, правда линк сейчас не найду, когда дерево организуется так, что вместо указателя на родителя все элементы имеют указатели на предыдущий и следующий элемент, а номера им распределяют сверху вниз слева направо как-то так:
___0___
__1__8__
_2_5....
3_46_7....


Судя по описание речь о Nested Set.

12
26 июля 2011 года
alekciy
3.0K / / 13.12.2005
Цитата: trivium
Всем привет.
Есть задача реализовать вывод обычного дерева, но делать это без рекурсии...
Как-то это возможно сделать?


На выбор: Способы хранения деревьев в базах данных, выбрав понравившийся алгоритм можно искать реализацию в виде готовой библиотеки, коих достаточно.

271
26 июля 2011 года
MrXaK
721 / / 31.12.2002
Цитата: alekciy
Судя по описание речь о 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

1.8K
26 июля 2011 года
trivium
128 / / 31.01.2010
Спасибо за ссылки.
А какой должна быть структура таблицы, чтобы можно было по корневым элементам выбрать все подветки одним запросом?
271
27 июля 2011 года
MrXaK
721 / / 31.12.2002
ну вот указанный мной и alekciy вариант это и делает наиболее удобно)) в первой ссылке моего поста даже показано
SELECT * FROM tree WHERE lft BETWEEN 2 AND 11 ORDER BY lft ASC;
где 2 и 11 собственно lft и rgt вершины))
укажем 0 и last - получим всё дерево
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог