首页 > 代码库 > 40: Binary Tree Preorder Traversal

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指针,指向其后继结点,组成一个环,在第二次遍历到这个结点时,由于其左子树已经遍历完了,则访问该结点。             * */

 

40: Binary Tree Preorder Traversal