Методы обхода постпорядка без рекурсии в двоичных деревьях

Обход бинарного дерева в обратном порядке — это способ посещения узлов дерева в определенном порядке. Это означает посещение левого поддерева, затем правого поддерева и, наконец, корневого узла. Вот несколько методов выполнения обратного обхода без использования рекурсии:

Метод 1: использование явного стека

  1. Создайте пустой стек.
  2. Поместите корневой узел в стек.
  3. Создать пустой список результатов.
  4. Пока стек не пуст:
    a. Извлеките верхний узел из стека.
    b. Добавьте значение извлеченного узла в список результатов.
    c. Поместите левый дочерний элемент извлеченного узла в стек, если он существует.
    d. Поместите правый дочерний элемент извлеченного узла в стек, если он существует.
  5. Переверните список результатов, чтобы получить обратный порядок обхода.

Метод 2: обход Морриса

  1. Инициализировать текущий узел как корневой.
  2. Пока текущий узел не равен NULL:
    a. Если у текущего узла нет правого дочернего узла:
    i. Добавьте значение текущего узла в список результатов.
    ii. Перейти к левому дочернему элементу текущего узла.
    b. Остальное:
    я. Найдите предшественника по порядку текущего узла (самый правый узел в левом поддереве или самый левый узел в правом поддереве).
    ii. Если правый дочерний элемент предшественника равен NULL:
    A. Установите правого дочернего элемента предшественника в текущий узел.
    B. Перейдите к правому дочернему узлу текущего узла.
    iii. Если правый дочерний элемент предшественника является текущим узлом:
    A. Установите для правого дочернего элемента предшественника значение NULL.
    B. Добавьте значение текущего узла в список результатов.
    C. Перейти к левому дочернему элементу текущего узла.

Метод 3: использование двух стопок

  1. Создайте две пустые стопки: stack1 и stack2.
  2. Поместите корневой узел в стек1.
  3. Пока стек1 не пуст:
    a. Извлеките верхний узел из стека1 и поместите его в стек2.
    b. Поместите левый дочерний элемент извлеченного узла в стек1, если он существует.
    c. Поместите правый дочерний элемент извлеченного узла в стек1, если он существует.
  4. Поменяйте местами элементы stack2, чтобы получить обратный порядок обхода.

Метод 4: использование одного стека

  1. Создайте пустой стек.
  2. Инициализировать переменный ток как корень.
  3. Пока текущий узел не равен NULL или стек не пуст:
    а. Если текущий узел не NULL:
    i. Поместить текущий узел в стек.
    ii. Установите текущий узел как его левый дочерний элемент.
    b. Остальное:
    я. Просмотрите верхний узел стека, не выталкивая его.
    ii. Если правый дочерний узел просматриваемого узла существует и еще не обработан, установите текущий узел как правый дочерний и повторите шаг 3a.
    iii. В противном случае извлеките верхний узел из стека, добавьте его значение в список результатов и установите для текущего узла значение NULL.
  4. Переверните список результатов, чтобы получить обратный порядок обхода.