2009-10-15 5 views
0

Есть ли какой-либо алгоритм, который может рекурсивно пересекать дерево в порядке уровня и нерекурсивно в postorder.Thanks много.реверсивный реверсивный рельеф в первом порядке и в глубине-порядке

+1

Это ваша домашняя работа? –

+1

нет, вчера вечером я принял участие в бумажном тестировании одной компании. – cppguy

+0

На первом уровне вы имеете в виду ширину? – tonfa

ответ

1

Чтобы получить эффективный рекурсивный поиск по ширине, вы можете использовать iterative deepening depth-first search. Это особенно хорошо для ситуаций, когда коэффициент ветвления высокий, где обычный поиск по ширине имеет тенденцию задыхаться от чрезмерного потребления памяти.

Редактировать:Marcos Marin already mentioned it, но для полноты картины, the Wikipedia page on breadth-first traversal описывает алгоритм, таким образом:

  1. Епдиеие корневой узел.
  2. Удалите узел и осмотрите его.
    • Если искомый элемент найден в этом узле, закройте поиск и верните результат.
    • В противном случае установите в очередь всех преемников (прямых дочерних узлов), которые еще не были обнаружены.
  3. Если очередь пуста, каждый узел на графе был рассмотрен - выйдите из поиска и верните «не найден».
  4. Повторите процедуру с шага 2.

Примечание: Используя стек вместо очереди превратит этот алгоритм в глубину первого поиска.

Эта последняя строка, очевидно, вам интересна, если вы хотите сделать нерекурсивный проход по глубине. Получение предварительного или пост-заказа - это просто вопрос о том, как добавить узлы на шаге 2.b.

0

Wikipedia говорит,

Traversal

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

Эти шаги (ни в порядке) являются: выполняя действие на текущем узле (далее в качестве «посещения» узел), пересекая на левый дочерний узел, и перемещения к правому ребенка узел. Таким образом, процесс наиболее легко описывается через рекурсию.

Для перемещения непустого бинарного дерева в предзаказе, выполните следующие операции рекурсивно на каждый узле, , начиная с корневым узлом:

  1. Посетите узел.
  2. Перемещение левого поддерева.
  3. Пройдите вправо поддерева. (Это также называется Depth-first traversal.)

Для того, чтобы пройти через непустое бинарное дерево в заказовМои, выполнить следующие операции рекурсивно в каждом узле:

  1. траверс левого поддерева.
  2. Посетите узел.
  3. Пройдите вправо поддерева. (Это также называется Симметричный обход.)

Для того, чтобы пройти через непустое бинарное дерево в postorder, выполнить следующие операции рекурсивно в каждом узле:

  1. траверс левого поддерева.
  2. Пройдите вправо поддерева.
  3. Посетите узел.

Наконец, деревья также могут перемещаться в уровне порядка, где мы посещаем каждый узел на уровне, прежде чем идти к более низкого уровня.Это также называется Breadth-first traversal.

+0

о, спасибо! Я забыл, что предварительный заказ - это первый шаг. – cppguy

+0

На самом деле не отвечает на вопрос, ваш обход после рекурсии рекурсивный, и вы не опубликовали нерекурсивное решение для обхода ширины. – tonfa

1

Вы можете возвращать дерево в порядке после итеративного использования, используя стек вместо стека неявного вызова, используемого в рекурсии.

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