40: Binary Tree Preorder Traversal

 /************************************************************************/
            /*       40:  Binary Tree Preorder Traversal                               */
            /************************************************************************/
            /*
             * Given a binary tree, return the preorder traversal of its nodes' values.

For example:
Given binary tree {1,#,2,3},

   1
    \
     2
    /
   3

return [1,2,3].
             * */
            /****前序遍历 preOrder tree 递归方法实现的*** Time: O(n), Space: O(n).*****************************************************************/
            /*
             * 应用1: 文件目录显示:
             * 显示文件夹时,子文件夹缩进,同级的文件夹缩进相同距离,适合使用前序遍历
             * */

 

  public List<Integer> preorderTraversal(TreeNode root) {
                
                List<Integer> source=new ArrayList<Integer>();
                String str="";
                preorderTree(root,source,str);
                return source;
            }
            
            private void preorderTree(TreeNode node,List<Integer> nodes,String str)
            {
                if(node==null)
                {
                    return;
                }
                str+="--------";
                System.out.println(str+"---->"+node.val);
                nodes.add(node.val);
                preorderTree(node.left,nodes,str);
                preorderTree(node.right,nodes,str);
            }
            
            /****前序遍历 preOrder tree Time: O(n), Space: O(n) 栈迭代方法实现的********************************************************************/
            /*
             * root-- left --right   
             * */
            public List<Integer> preorderTraversal2(TreeNode root)
            {
                List<Integer> results=new ArrayList<Integer>();
                Stack<TreeNode> stack=new Stack<TreeNode>();
                stack.push(root);
                TreeNode node=null;
                while(!stack.isEmpty())
                {
                    node=stack.pop();
                    results.add(node.val);
                    if(node.right!=null)  
                    {
                        stack.push(node.right);
                    }
                    if(node.left!=null)
                    {
                        stack.push(node.left);
                    }
                }
                return results;
            }
            
            
            /**Threaded tree (Morris)***Time: O(n), Space: O(1)*******************************************************************/
            /*二叉树的Morris遍历可不使用用栈,在常量空间O(1)、线性时间O(n)内实现二叉树的前中后序遍历,且遍历后不破坏二叉树的形状(中间过程允许改变其形状)。
Morris遍历的基本原理是利用所有叶子结点的right指针,指向其后继结点,组成一个环,在第二次遍历到这个结点时,由于其左子树已经遍历完了,则访问该结点。
             * */

 

posted @ 2015-01-27 22:07  Star Yoda  阅读(118)  评论(0编辑  收藏  举报