Java数据结构系列之——树(5):二叉树的后序遍历的递归与非递归实现
package tree.binarytree;
import java.util.Stack;
/**
* 二叉树后序遍历的递归与非递归实现
*
* @author wl
*
*/
public class BitreePostOrder {
// 后序遍历的递归实现
public static void biTreePostOrderByRecursion(BiTreeNode root) {
if (root == null) {
return;
}
biTreePostOrderByRecursion(root.leftNode);
biTreePostOrderByRecursion(root.rightNode);
System.out.println(root.data);
}
/**
* 后序遍历的非递归实现 要保证根节点在左孩子和右孩子访问之后才能访问,因此,对于任一结点current,先将其入栈,如果current不存在左孩子
* 和右孩子,则可以直接访问它;或者current存在左孩子或者右孩子,但是其左孩子和右孩子都已近访问过了,则同样可以直接
* 访问改结点。若非上述两种情况,则将current的右孩子和左孩子(注意是先右孩子后左孩子)依次入栈。这样就保证了每次取
* 栈顶元素的时候,左孩子在右孩子前被访问,左孩子和右孩子都在根结点前面被访问
*
* @param root
*/
public static void biTreePostOrder(BiTreeNode root) {
Stack stack = new Stack();// 栈,用于存放二叉树的结点
BiTreeNode current = root;// 当前结点
BiTreeNode pre = null;// 前一次被访问的结点
stack.push(root);
while (!stack.empty()) {
current = stack.peek();
if ((current.leftNode == null && current.rightNode == null)
|| (pre != null && (pre == current.leftNode || pre == current.rightNode))) {
System.out.println(current.data);
stack.pop();
pre = current;
} else {
if (current.rightNode != null) {
stack.push(current.rightNode);
}
if (current.leftNode != null) {
stack.push(current.leftNode);
}
}
}
}
}