Страницы

Поиск по вопросам

четверг, 9 января 2020 г.

Прохождение бинарного дерева (post-order)

#cpp #c #алгоритм #бинарное_дерево


Здравствуйте, как на с/с++ написать нерекурсивный обход бинарного дерева через стек
методом post-order (сначала листья, потом корень)? 
    


Ответы

Ответ 1



Т.к. рекурсию использовать нельзя, мы вместо неё будем использовать два стэка. Вот весь алгоритм, в результате его будут распечатаны все вершины бинарного дерева в post-order порядке (можно вместо распечатки делать какое-то полезное действие): Добавить корень в первый стэк. Пока первый стэк не пуст выполнять следующие два подпункта: 2.1. Извлечь узел из вершины первого стэка, добавить его во второй стэк. 2.2. Добавить левого затем правого ребёнка узла из п. 2.1 в первый стэк. Распечатать содержимое второго стэка, т.е. в цикле извлекать вершину второго стэка и печатать. Замечание: в конце порядок распечатки для поддеревьев будет тот же что и при помещении в 1й стэк, т.е. мы помещали в 1й стэк левого а затем правого ребёнка, при распечатке в итоге будет раньше распечатано левое поддерево, затем правое, а затем родитель. Если нужно в распечатке иметь вначале правое поддерево а затем левое тогда нужно в 1й стэк помещать вначале правого ребёнка затем левого.

Комментариев нет:

Отправить комментарий