首先从简单的例子开始
上图二叉树的后序遍历序列是"231", 颠倒一下就是"132", 而其前序遍历是"123"
有什么发现?
后序遍历的倒序和前序的区别只是2和3的交换, 反映在算法中就是先左后右和先右后左的差别.
也就是说后序遍历的倒序就是按先右后左顺序的前序遍历.
所以我们只需要按先右后左顺序去前序遍历二叉树, 再将其结果颠倒就是正常后序遍历算法的结果.
而如果使用栈的话, 先入后出也就相当于颠倒了顺序.
根据上述思路就可以写出以下的非递归后序遍历算法
public void nonRecursivePostOrder(Node root){
//用于保存访问顺序的List
LinkedList<Node> reverse = new LinkedList<>();
LinkedList<Node> stack = new LinkedList<>();
Node pNode = root;
while (null != pNode || !stack.isEmpty()) {
if (pNode != null) {
//与stack同步压入元素以保存访问顺序
reverse.push(pNode);
stack.push(pNode);
//先走完右节点
pNode = pNode.rightNode;
}else {
pNode = stack.pop();
//再走左节点
pNode = pNode.leftNode;
}
}
//弹出并访问所有元素完成遍历.
while (!reverse.isEmpty()){
System.out.println(reverse.pop());
}
}
与递归后序遍历对比一下是否正确
public static void main(String[] args) {
Node binary = new Node();
int[] wait = {43, 61, 84, 21, 23, 1, 36, 73, 89, 35, 27, 28, 2, 8, 96, 283, 83};
for (int i : wait) {
binary.add(i);
}
//这里使用ArrayList方便打印查看结果
ArrayList post = new ArrayList();
ArrayList nonRecursivePre = new ArrayList();
binary.postOrder(post);
binary.nonRecursivePostOrder(nonRecursivePre);
System.out.println("递归后序遍历:"+post);
System.out.println("非递归后序遍历:"+nonRecursivePre);
}
测试结果