非遞歸實現二叉樹的後續遍歷,思想是先定義一個帶有標記和二叉樹節點的類,把類壓棧,並且要設置標記,賦值爲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+" ");//不滿足條件,打印當前節點
}
}
}
}
}