遞歸和非遞歸實現二叉樹的後續遍歷

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章