码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2014-12-06 08:55:25      阅读:283      评论:0      收藏:0      [点我收藏+]

标签:io   ar   os   java   on   数据   ef   amp   as   

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);
				}
			}
		}
	}
}

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

标签:io   ar   os   java   on   数据   ef   amp   as   

原文地址:http://blog.csdn.net/tmwl0728/article/details/41758869

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!