LeetCode OJ

二叉树的三种遍历,我之前写过这个的迭代实现,详见 这里

下面是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     }
有问题可以和我联系,bettyting2010#163 dot com
原文地址:https://www.cnblogs.com/echoht/p/3687110.html