递归和非递归实现二叉树的后续遍历

非递归实现二叉树的后续遍历,思想是先定义一个带有标记和二叉树节点的类,把类压栈,并且要设置标记,赋值为true,然后出栈,并且改变标记true为false,最后遍历右子树,直到第二次开始出栈,标记是false,直接访问节点。

递归和非递归实现过程如下所示:

package cn.edu.nwu.structs.tree;
import java.util.Stack;

/**
 * @author jcm
 *	定义一个类,用来避免二叉树节点重复打印
 *  时间 2016年9月3日
 */
class isSameTNode{
	public BinaryTreeNode BinaryTNode;//二叉树节点,用于存放二叉树节点
	public boolean isSame;//定义二叉树节点是否第2次访问,避免重复打印二叉树节点
	public isSameTNode(){
	}
}
/**
 * 
 * @author jcm
 *	后续递归和非递归打印二叉树
 * 时间 2016年9月3日
 */
public class PostOrderBinaryTree {
	public static void main(String[] args) {
		BinaryTreeNode root = CreateBinaryTree.createBinaryTree();
		System.out.println("递归实现后续遍历");
		postOrder(root);
		System.out.println();
		System.out.println("非递归实现后续遍历");
		postOrderRecursion(root);
	}
	/**
	 * 递归实现前序遍历
	 * @param root
	 */
	public static void postOrder(BinaryTreeNode root){
		if(root == null){
			return ;
		}
		if(root.leftTreeNode != null){
			postOrder(root.leftTreeNode);
		}
		if(root.rightTreeNode != null){
			postOrder(root.rightTreeNode);
		}
		System.out.print(root.data+" ");
	}
	/**
	 * @author jcm
	 * 非递归实现二叉树后续遍历
	 * @param root 树根
	 */
	public static void postOrderRecursion(BinaryTreeNode root){
		if(root == null){
			return ;
		}
		//定义当前节点
		BinaryTreeNode currentTNode = root;
		//定义栈,用来存放另外一个类,避免二叉树节点重复打印
		Stack<isSameTNode> stack = new Stack<isSameTNode>();//避免重复
		isSameTNode tempTNode;//定义临时存放类
		while(!stack.isEmpty() || currentTNode != null){
			while(currentTNode != null){
				isSameTNode TNode = new isSameTNode();
				TNode.BinaryTNode = currentTNode;
				TNode.isSame = true;//,第一次的时候遍历二叉树节点,给他赋值true,第二次是false
				stack.push(TNode);
				currentTNode = currentTNode.leftTreeNode;
			}
			if(!stack.isEmpty()){
				tempTNode = stack.peek();
				stack.pop();
				if(tempTNode.isSame == true){
					tempTNode.isSame = false;//第一次完后,要修改值,当再次遍历的时候,条件语句不成立
					stack.push(tempTNode);//第二次压栈
					currentTNode = tempTNode.BinaryTNode.rightTreeNode;//跳转到右边节点
				}else{
					System.out.print(tempTNode.BinaryTNode.data+" ");//不满足条件,打印当前节点
				}
			}
		}
	}
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值