二叉树的三种遍历,我之前写过这个的迭代实现,详见 这里。
下面是Leetcode这道题的AC代码,同样采用迭代方法,但是我用了一个ArrayList去记录已经出栈的节点,这样当我考察栈顶节点是否直接弹出时,只要看它是否有左右子节点或者是它的左右子节点是否已经被弹出。这种方法可能在时间复杂度上更高。
1 /** 2 * 后序遍历 3 * @param root 4 * @return 5 */ 6 public ArrayList<Integer> postOrderTraversal(TreeNode root) 7 { 8 ArrayList<Integer> r = new ArrayList<Integer>(); 9 if(root == null) 10 return null; 11 LinkedList<TreeNode> stack = new LinkedList<TreeNode>(); 12 13 ArrayList<TreeNode> tr = new ArrayList<TreeNode>(); 14 stack.push(root); 15 while(!stack.isEmpty()) 16 { 17 TreeNode temp = stack.peek(); 18 if((temp.left == null && temp.right == null) || 19 tr.contains(temp.left) || tr.contains(temp.right)) 20 { 21 stack.pop(); 22 r.add(temp.val); 23 tr.add(temp); 24 }else { 25 if(temp.right!=null) 26 stack.push(temp.right); 27 if(temp.left!=null) 28 stack.push(temp.left); 29 } 30 } 31 return r; 32 } 33 /** 34 * 先序遍历 35 * @param root 36 * @return 37 */ 38 public ArrayList<Integer> preorderTraversal(TreeNode root) 39 { 40 if(root == null) 41 return null; 42 LinkedList<TreeNode> stack = new LinkedList<TreeNode>(); 43 ArrayList<Integer> r = new ArrayList<Integer>(); 44 stack.push(root); 45 while(!stack.isEmpty()){ 46 TreeNode temp = stack.pop(); 47 r.add(temp.val); 48 if(temp.right!=null) 49 stack.push(temp.right); 50 if(temp.left!=null) 51 stack.push(temp.left); 52 } 53 return r; 54 }