Идея состоит в том, чтобы переместиться вниз к крайнему левому узлу, используя левый указатель. При перемещении вниз нажмите root и правый дочерний элемент root в стек. Как только мы дойдем до самого левого узла, распечатайте его, если у него нет правого потомка. Если у него есть правильный дочерний элемент, измените корень так, чтобы правильный дочерний элемент обрабатывался ранее.
Ниже приводится подробный алгоритм.
1.1 Create an empty stack
2.1 Do following while root is not NULL
a) Push root's right child and then root to stack.
b) Set root as root's left child.
2.2 Pop an item from stack and set it as root.
a) If the popped item has a right child and the right child
is at top of stack, then remove the right child from stack,
push the root back and set root as root's right child.
b) Else print root's data and set root as NULL.
2.3 Repeat steps 2.1 and 2.2 while stack is not empty.
Давайте рассмотрим следующее дерево
Ниже приведены шаги для печати обхода по порядку вышеупомянутого дерева с использованием одного стека.
1. Right child of 1 exists.
Push 3 to stack. Push 1 to stack. Move to left child.
Stack: 3, 1
2. Right child of 2 exists.
Push 5 to stack. Push 2 to stack. Move to left child.
Stack: 3, 1, 5, 2
3. Right child of 4 doesn't exist. '
Push 4 to stack. Move to left child.
Stack: 3, 1, 5, 2, 4
4. Current node is NULL.
Pop 4 from stack. Right child of 4 doesn't exist.
Print 4. Set current node to NULL.
Stack: 3, 1, 5, 2
5. Current node is NULL.
Pop 2 from stack. Since right child of 2 equals stack top element,
pop 5 from stack. Now push 2 to stack.
Move current node to right child of 2 i.e. 5
Stack: 3, 1, 2
6. Right child of 5 doesn't exist. Push 5 to stack. Move to left child.
Stack: 3, 1, 2, 5
7. Current node is NULL. Pop 5 from stack. Right child of 5 doesn't exist.
Print 5. Set current node to NULL.
Stack: 3, 1, 2
8. Current node is NULL. Pop 2 from stack.
Right child of 2 is not equal to stack top element.
Print 2. Set current node to NULL.
Stack: 3, 1
9. Current node is NULL. Pop 1 from stack.
Since right child of 1 equals stack top element, pop 3 from stack.
Now push 1 to stack. Move current node to right child of 1 i.e. 3
Stack: 1
10. Repeat the same as above steps and Print 6, 7 and 3.
Pop 1 and Print 1.
С
// C-программа для итеративного обхода после заказа с использованием одного стека #include <stdio.h> #include <stdlib.h>
// Максимальный размер стека #define MAX_SIZE 100
// Узел дерева
structNode
{
intdata;
structNode *left, *right;
};
// Тип стека
structStack
{
intsize;
inttop;
structNode* *array;
};
// Вспомогательная функция для создания нового узла дерева
System.out.println("Post order traversal of binary tree is :");
System.out.println(mylist);
}
}
// Этот код предоставлен Mayank Jaiswal
питон
# Python-программа для итеративного обхода после заказа # используя один стек
# Хранит ответ
ans =[]
# Узел двоичного дерева
classNode:
# Конструктор для создания нового узла
def__init__(self, data):
self.data =data
self.left =None
self.right =None
defpeek(stack):
iflen(stack) > 0:
returnstack[-1]
returnNone
# Итеративная функция для выполнения пост-заказа обхода # данное двоичное дерево
defpostOrderIterative(root):
# Проверить на пустое дерево
ifroot isNone:
return
stack =[]
while(True):
while(root):
# Нажмите правый дочерний элемент root, а затем root в стек
ifroot.right isnotNone:
stack.append(root.right)
stack.append(root)
# Установить root как левого потомка root
root =root.left
# Вытолкнуть предмет из стека и установить его как root
root =stack.pop()
# Если у всплывающего элемента есть правильный дочерний элемент и
# правый ребенок еще не обработан, тогда убедитесь
# правый потомок обрабатывается до корня
if(root.right isnotNoneand
peek(stack) ==root.right):
stack.pop() # Удалить правого потомка из стека
stack.append(root) # Вернуть корень в стек
root =root.right # изменить корень так, чтобы
# Right Childis обрабатывается следующим
# Иначе распечатать данные root и установить root как None
else:
ans.append(root.data)
root =None
if(len(stack) <=0):
break
# Водительская программа для проверки вышеуказанной функции
root =Node(1)
root.left =Node(2)
root.right =Node(3)
root.left.left =Node(4)
root.left.right =Node(5)
root.right.left =Node(6)
root.right.right =Node(7)
print"Post Order traversal of binary tree is"
postOrderIterative(root)
printans
# Этот код предоставлен Nikhil Kumar Singh (nickzuck_007)
Выход:
Post Order traversal of binary tree is
[4, 5, 2, 6, 7, 3, 1]
Способ 2: Нажмите прямо на корневой узел два раза, двигаясь влево. Во время всплывающего окна, если вы обнаружите, что stack top () совпадает с root, перейдите к root-> right, иначе print root.
// Простая Java-программа для печати PostOrder Traversal (Iterative)
// Программа драйвера для проверки вышеуказанных функций
publicstaticvoidmain(String args[])
{
PostOrder tree = newPostOrder();
// Давайте создадим деревья, показанные на диаграмме выше
tree.root = newNode(1);
tree.root.left = newNode(2);
tree.root.right = newNode(3);
tree.root.left.left = newNode(4);
tree.root.left.right = newNode(5);
tree.root.right.left = newNode(6);
tree.root.right.right = newNode(7);
System.out.println("Post order traversal of binary tree is :");
tree.postOrderIterative(tree.root);
}
}
Выход:
Post Order traversal of binary tree is:
4, 5, 2, 6, 7, 3, 1
Эта статья составлена Aashish Barnwal . Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.