思路:
对于节点p可以分情况讨论
1. p如果是叶子节点,直接输出
2. p如果有孩子,且孩子没有被访问过,则按照右孩子,左孩子的顺序依次入栈
3. p如果有孩子,而且孩子都已经访问过,则访问p节点
实现方法:每次押入两个同样的节点入栈,则一次代表已访问,一次代表未访问
上代码:
class Node {
int data;
Node left, right;
Node(int item) {
data = item;
left = right = null;
}
}
class BinaryTree {
Node root;
public List<Integer> iterativePostOrder() {
List<Integer> res = new ArrayList<>();
if (root == null) {
return res;
}
Node p = root;
Stack<Node> sta = new Stack<>();
sta.push(p);
sta.push(p);
while (!sta.empty()) {
p = sta.peek();
sta.pop();
if (!sta.isEmpty() && p == sta.peek()) {
if (p.right != null) {
sta.push(p.right);
sta.push(p.right);
}
if (p.left != null) {
sta.push(p.left);
sta.push(p.left);
}
}else {
res.add(p.data);
}
}
return res;
}
}