1 ** 2 * 二叉樹先序遍歷非遞歸 3 * @param root 4 */ 5 public void preOrder_no_recursive(TreeNode root){ 6 if(root == null) return; 7 8 Stack<TreeNode> stack = new Stack<>(); 9 stack.add(root); 10 while(!stack.isEmpty()){ 11 TreeNode tn = stack.pop(); 12 System.out.println(tn.val); // 輸出 13 if(tn.right != null) stack.add(tn.right); 14 if(tn.left != null)stack.add(tn.left); 15 } 16 } 17 18 /** 19 * 二叉樹中序遍歷非遞歸 20 * @param root 21 */ 22 public void inOrder_no_recursive(TreeNode root){ 23 if(root==null)return; 24 Stack<TreeNode> stk = new Stack<TreeNode>(); 25 TreeNode p = root;//輔助節點 26 stk.add(p); 27 while(stk.isEmpty() == false) { 28 //只要你有左孩子,就將左孩子壓入棧中 29 if(p!=null && p.left!=null) { 30 stk.add(p.left); 31 p = p.left; 32 }else { 33 p = stk.pop();//彈出棧頂節點 左孩子--->根節點 34 System.out.print(p.val+" ");//訪問 35 if(p!=null && p.right!=null) {//如果棧點元素有右孩子的話,將有節點壓入棧中 36 stk.add(p.right); 37 p = p.right; 38 }else 39 p = null;//p=stk.pop;已經訪問過p了,p設置為null 40 } 41 } 42 } 43 44 /** 45 * 二叉樹后序遍歷非遞歸 46 * @param root 47 */ 48 public void postOrder_no_recursive(TreeNode root){ 49 if(root == null)return; 50 TreeNode p = root; 51 TreeNode pVisit = null; 52 Stack<TreeNode> stk = new Stack<TreeNode>(); 53 stk.add(p); 54 55 while(stk.isEmpty() == false) { 56 //只要你有左孩子,就將左孩子壓入棧中 57 if(p!=null && p.left!=null) { 58 stk.add(p.left); 59 p = p.left; 60 }else { 61 p = stk.peek();//棧頂元素,先出棧,可能還有右孩子 62 if(p.right==null || p.right==pVisit) {//如果沒有右孩子或右孩子已經訪問過了,出棧 63 System.out.print(p.val+" "); 64 pVisit = p;//這個很重要,考慮一下只有右孩子的樹,得不斷的回溯 65 p = null;//沒有新節點加入,繼續進行出棧操作 66 stk.pop(); 67 }else {//如果有右孩子,右孩子入棧 68 pVisit = p.right; 69 stk.add(p.right); 70 p = p.right; 71 } 72 } 73 } 74 }