• 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指针,指向其后继结点,组成一个环,在第二次遍历到这个结点时,由于其左子树已经遍历完了,则访问该结点。
                 * */
  • 相关阅读:
    Python使用struct处理二进制
    ProtoBuf与Python结合使用初步
    智能指针shared_ptr的用法
    C++模板
    mac 安装protobuf,并编译为java,c++,python
    java的HashCode方法
    JVM的内存结构
    HashSet与TreeSet的比较
    面向对象的特征有哪些方面?
    Collection与Collections的区别是什么?
  • 原文地址:https://www.cnblogs.com/theonemars/p/4254327.html
Copyright © 2020-2023  润新知