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 }
原文地址:https://www.cnblogs.com/oldhands/p/11592319.html
时间: 2024-10-06 00:40:17