频道栏目
首页 > 资讯 > Java > 正文

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

14-12-06        来源:[db:作者]  
收藏   我要投稿
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);
				}
			}
		}
	}
}

相关TAG标签
上一篇:[BZOJ 1085][SCOI 2005]骑士精神(IDA*搜索)
下一篇:邻接表和邻接矩阵手写简洁代码DFS BFS
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站