二叉树先序中序后续遍历非递归
Posted oldhands
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树先序中序后续遍历非递归相关的知识,希望对你有一定的参考价值。
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
以上是关于二叉树先序中序后续遍历非递归的主要内容,如果未能解决你的问题,请参考以下文章