Java實現二叉樹後序非遞迴遍歷(好理解)
阿新 • • 發佈:2019-01-10
//不明白的大家可以一起討論!歡迎留言! /** * 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 }