Russian Qt Forum
Май 11, 2024, 16:29 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Алгоритм обхода дерева  (Прочитано 14789 раз)
Apostol
Гость
« : Июнь 17, 2009, 15:29 »

Не могу никак найти нерекурсивный алгоритм восходящего (снизу-вверх) обхода дерева... Пересмотрел кучу книг, в них только алгоритмы для нисходящего обхода. Может кто знает как его реализовать или где посмотреть как он реализуется? Как я понял, для обхода нужно использовать стек, но как им воспользоваться для данного случая ума не приложу. Нужен именно нерекурсивный (невложенный) алгоритм обхода...
Записан
spectre71
Гость
« Ответ #1 : Июнь 17, 2009, 15:40 »

А по какому принципу ты хочешь сделать обход снизу-вверх?
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3258


Просмотр профиля
« Ответ #2 : Июнь 17, 2009, 15:55 »

видимо известны все листовые вершины, к примеру в виде списка.тогда. обработать текущую пока у текущей вершины есть парент, текущая стала парентом, а прошлую текущую в список обработанных. Таким образом  нужно проверять не обработали ли уже эту вершину. Когда парента нет (достигли корня) или текущая уже обработана, то переходим к следующей из входного списка вершин. Но что-то как-то бредово звучит сама задача.
В случае нерекурсивного обхода сверху вниз вводим стек. Пихаем корень с стек. Пока стек не пуст: делаем pop, обрабатываем, push в стек все подвершины. По идее должно работать, придумано на коленке
Записан
spectre71
Гость
« Ответ #3 : Июнь 17, 2009, 15:59 »

Проще пройтись по узлам сверху-вниз занося их в список. После этого обрабатывать элементы списка от конца к началу.
Записан
Apostol
Гость
« Ответ #4 : Июнь 17, 2009, 16:18 »

В случае нерекурсивного обхода сверху вниз вводим стек. Пихаем корень с стек. Пока стек не пуст: делаем pop, обрабатываем, push в стек все подвершины. По идее должно работать, придумано на коленке
Я что-то такое и предполагал, щас сижу этот алгоритм до конца прорабатываю.
сам узел дерева дан в такой форме:
struct Tree
{
   int data;
   Tree *left;
   Tree *right;
};
left и right - левый и правый ветви (дерево бинарное)
Идея такова. Два цикла. Первый имеет приоритет на левую ветвь дерева, идет сверху вниз. При этом все пройденные узлы загоняются в стек. Второй включается в работу как только достигли листа дерева. Второй идет снизу вверх, узлы берем из стека и т.д. до тех пор пока не получим пустой стек. Последнее значение, хранящееся в стеке, и будет корнем дерева.
« Последнее редактирование: Июнь 17, 2009, 16:23 от Apostol » Записан
spectre71
Гость
« Ответ #5 : Июнь 17, 2009, 16:39 »

Не надо усложнять. "Авварон" тебе написал оптимальный нерекурсивный алгоритм обхода сверху вниз.
1) Береш Root запихиваешь в стек(List1)
2) Далее запускается цикл пока стек(List1) не пуст
3) - Делаем pop, получаем узел
    - Заносим узел во второй список(List2)
    - Заносим для узла его дочерние элементы в стек
4) После окончания цикла берем (List2) проходим от конца к началу.

Если надо обойти дерево снизу вверх по уровням, то в List2 заносим пару {узел, уровень}, а потом сортируем по уровню как надо.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3258


Просмотр профиля
« Ответ #6 : Июнь 17, 2009, 17:25 »

так list2 то не нужен, парсить можно в процессе обхода...
Код:
list <Node>stack;
stack.pushFront(root);
while(!stack.IsEmpty())
{
    Node current = stack.popFront();
    parseNode(current);
    foreach(Node child, current.children)
    {
        stack.pushFront(child);
    }
}
вот так вот как-то
Записан
spectre71
Гость
« Ответ #7 : Июнь 17, 2009, 18:20 »

так list2 то не нужен, парсить можно в процессе обхода...

Ему нужен восходящий обход!
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3258


Просмотр профиля
« Ответ #8 : Июнь 17, 2009, 18:33 »

я запутался) из поста 4 вроде следует обратное:)
Записан
Apostol
Гость
« Ответ #9 : Июнь 17, 2009, 18:45 »

Тэксс. Свой одностековый алгоримт я реализовал, гуд работает (хоть и замудренный он получился), щас бум пробовать 2х стековый spectre71 Подмигивающий
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3258


Просмотр профиля
« Ответ #10 : Июнь 17, 2009, 19:44 »

аааа, то есть дан root дерева, но обойти надо снизу вверх слева направо?
Записан
Apostol
Гость
« Ответ #11 : Июнь 17, 2009, 20:06 »

аааа, то есть дан root дерева, но обойти надо снизу вверх слева направо?
Так точно)
Записан
Apostol
Гость
« Ответ #12 : Июнь 18, 2009, 10:38 »

Всем спасибо за ответы, задача решена, тема закрыта Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.048 секунд. Запросов: 22.