Итак, я знаком с обходом постпорядка:
L -> R -> P (слева направо к родителю).
Я видел код, который мог довольно элегантно выполнять обход в обратном порядке, используя 2 стека:
public void postOrderTransverse(Node r){
if(r == null){return;}
Stack<Node> s = new Stack<Node>();
Stack<Node> reverser = new Stack<Node>();
s.push(r);
while(!s.isEmpty()){
Node temp = s.pop();
reverser.push(temp);
if (temp.left != null){
s.push(temp.left);}
if(temp.right != null){
s.push(temp.right);}
}
while(!reverser.empty()){
System.out.print(reverser.peek());
reverser.pop();
}
}
(через http://articles.leetcode.com/binary-tree-post-order-traversal/)
где, по сути, один стек просто переворачивает другой. Мне просто очень интересно, как это работает. У меня есть гипотеза, что Stack s принимает ввод, так что вывод будет примерно P -> R -> L, и он просто передает это на реверсор Stack, который выплевывает L -> R .-> P, так как это Last In First Out .
Однако, просто пытаясь продумать процессы этого алгоритма, я изо всех сил пытаюсь понять, как и почему Stack принимает входные данные именно так. Надеясь, что я мог бы получить некоторое представление о здесь! Спасибо :)