Обход бинарного дерева в обратном порядке — это способ посещения узлов дерева в определенном порядке. Это означает посещение левого поддерева, затем правого поддерева и, наконец, корневого узла. Вот несколько методов выполнения обратного обхода без использования рекурсии:
Метод 1: использование явного стека
- Создайте пустой стек.
- Поместите корневой узел в стек.
- Создать пустой список результатов.
- Пока стек не пуст:
a. Извлеките верхний узел из стека.
b. Добавьте значение извлеченного узла в список результатов.
c. Поместите левый дочерний элемент извлеченного узла в стек, если он существует.
d. Поместите правый дочерний элемент извлеченного узла в стек, если он существует. - Переверните список результатов, чтобы получить обратный порядок обхода.
Метод 2: обход Морриса
- Инициализировать текущий узел как корневой.
- Пока текущий узел не равен NULL:
a. Если у текущего узла нет правого дочернего узла:
i. Добавьте значение текущего узла в список результатов.
ii. Перейти к левому дочернему элементу текущего узла.
b. Остальное:
я. Найдите предшественника по порядку текущего узла (самый правый узел в левом поддереве или самый левый узел в правом поддереве).
ii. Если правый дочерний элемент предшественника равен NULL:
A. Установите правого дочернего элемента предшественника в текущий узел.
B. Перейдите к правому дочернему узлу текущего узла.
iii. Если правый дочерний элемент предшественника является текущим узлом:
A. Установите для правого дочернего элемента предшественника значение NULL.
B. Добавьте значение текущего узла в список результатов.
C. Перейти к левому дочернему элементу текущего узла.
Метод 3: использование двух стопок
- Создайте две пустые стопки: stack1 и stack2.
- Поместите корневой узел в стек1.
- Пока стек1 не пуст:
a. Извлеките верхний узел из стека1 и поместите его в стек2.
b. Поместите левый дочерний элемент извлеченного узла в стек1, если он существует.
c. Поместите правый дочерний элемент извлеченного узла в стек1, если он существует. - Поменяйте местами элементы stack2, чтобы получить обратный порядок обхода.
Метод 4: использование одного стека
- Создайте пустой стек.
- Инициализировать переменный ток как корень.
- Пока текущий узел не равен NULL или стек не пуст:
а. Если текущий узел не NULL:
i. Поместить текущий узел в стек.
ii. Установите текущий узел как его левый дочерний элемент.
b. Остальное:
я. Просмотрите верхний узел стека, не выталкивая его.
ii. Если правый дочерний узел просматриваемого узла существует и еще не обработан, установите текущий узел как правый дочерний и повторите шаг 3a.
iii. В противном случае извлеките верхний узел из стека, добавьте его значение в список результатов и установите для текущего узла значение NULL. - Переверните список результатов, чтобы получить обратный порядок обхода.