Java数据结构系列之——树(五):二叉树的后序遍历的递归与非递归实现

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<BiTreeNode> stack = new Stack<BiTreeNode>();// 栈,用于存放二叉树的结点
		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);
				}
			}
		}
	}
}