非递归实现二叉树的后续遍历,思想是先定义一个带有标记和二叉树节点的类,把类压栈,并且要设置标记,赋值为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+" ");//不满足条件,打印当前节点
}
}
}
}
}