1. 程式人生 > >Java實現二叉樹後序非遞迴遍歷(好理解)

Java實現二叉樹後序非遞迴遍歷(好理解)

//不明白的大家可以一起討論!歡迎留言!

	/**
	 * public class Node {
		public int data; //樹結點標號
		public Node lchild; //左子樹
		public Node rchild;  //右子樹
	}
	後序遍歷遞迴定義:先左子樹,後右子樹,再根節點。
	後序遍歷的難點在於:需要判斷上次訪問的節點是位於左子樹,還是右子樹。
		若是位於左子樹,則需跳過根節點,先進入右子樹,再回頭訪問根節點;
		若是位於右子樹,則直接訪問根節點。
	 */
	
	public void postOrder(Node node){
		if(node==null)
			return;
		Stack<Node> s = new Stack<Node>();
		
		Node curNode; //當前訪問的結點
		Node lastVisitNode; //上次訪問的結點
		curNode = node;
		lastVisitNode = null;
		
		//把currentNode移到左子樹的最下邊
		while(curNode!=null){
			s.push(curNode);
			curNode = curNode.getLchild();
		}
		while(!s.empty()){
			curNode = s.pop();  //彈出棧頂元素
			//一個根節點被訪問的前提是:無右子樹或右子樹已被訪問過
			if(curNode.getRchild()!=null&&curNode.getRchild()!=lastVisitNode){
				//根節點再次入棧
				s.push(curNode);
				//進入右子樹,且可肯定右子樹一定不為空
				curNode = curNode.getRchild();
				while(curNode!=null){
					//再走到右子樹的最左邊
					s.push(curNode);
					curNode = curNode.getLchild();
				}
			}else{
				//訪問
				System.out.println(curNode.getData());
				//修改最近被訪問的節點
				lastVisitNode = curNode;
			}
		} //while
	}