zoukankan      html  css  js  c++  java
  • 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指针,指向其后继结点,组成一个环,在第二次遍历到这个结点时,由于其左子树已经遍历完了,则访问该结点。
                 * */
  • 相关阅读:
    bzoj2946 [Poi2000]公共串(SA,SAM)
    77 最长公共子序列
    C++ lower_bound 与 upper_bound 函数
    76 最长上升子序列
    75 寻找峰值
    C++标准输入问题
    74 第一个错误的代码版本
    73 前序遍历和中序遍历树构造二叉树
    72 中序遍历和后序遍历树构造二叉树
    71 二叉树的锯齿形层次遍历
  • 原文地址:https://www.cnblogs.com/theonemars/p/4254327.html
Copyright © 2011-2022 走看看