2012-05-30 4 views
0

Я пытаюсь преобразовать дерево категорий в плоский список.Алгоритм преобразования дерева категорий в плоский список

В категориях любая категория может иметь n уровней подкатегорий.

For Ex.: 

Category1 
-SubCategory1 
-SubCategory2 
--SubCategor1 
---SubCategory1 
---SubCategory2 
----SubCategory1 
----SubCategory2 
---SubCategory3 
--SubCategory2 
-SubCategory3 

Category2 
-SubCategory1 
--SubCategory1 
---SubCategory1 
----SubCategory1 
---SubCategory3 
-SubCategory3 

...etc and so on. 

Язык не преграда Я просто пытаюсь сформулировать петлю/вложенные циклы, чтобы создать эту логику, чтобы преобразовать его в уплощенный список.

Любая помощь будет высоко оценена.

Заранее спасибо

ответ

2

Каждая запись в ваш плоский список будет узлом вашего дерева, который будет посещаться в соответствии с глубиной первого поиска. Для получения дополнительной информации, пожалуйста, see here

Редактировать: Оригинальное сообщение было отредактировано пару раз. Первоначально это выглядело так, как OP был после плоского списка, поскольку это будет выход BFS, но после более позднего редактирования он выглядел так, как OP был после плоского списка, так как это будет выход DFS. Более общим случаем было бы то, что «Каждая запись в плоский список будет узлом дерева, так как он посещается некоторой функцией обхода (например, BFS или DFS)».

+0

Спасибо DFS кажется, что я хочу сделать. но похоже, что он будет работать только для двоичной структуры дерева, но я ищу решение, когда дерево может иметь n ветвей на любом этапе. – praneybehl

+0

DFS и BFS будут пересекать деревья с узлами, имеющими любое количество ветвей. Из http://en.wikipedia.org/wiki/Depth-first_search#Pseudocode обратите внимание на часть «для всех ребер e в G». –

1

Я не знаю, что вы имеете в виду плоский список, но вы можете использовать стек (выполнение мудр, он может быть СТЛ вектор) для сохранения текущего прогресса во время рекурсивного посещения суб категории.

«Текущий прогресс», о котором я упоминал выше, должен хранить подкатегорию, которую вы сейчас посещаете, чтобы вы могли продолжить посещать другую подкатегорию при возврате.

Если вы можете сформулировать рекурсивный алгоритм, вы можете переписать его в этой форме.

+0

Спасибо, по плоскому списку Я имел в виду простой список – praneybehl

0

Вы можете легко сделать это с помощью функции рекурсии + std::copy.

+1

Рекурсия может привести к переполнению стека, когда количество уровней слишком велико. Это приемлемо, когда известно количество уровней. – nhahtdh

Смежные вопросы