LeetCode - Binary Tree Preorder Traversal | Darren's Blog



Given a binary tree, return the preorder traversal of its nodes' values.
Morris Traversal:O(1) space
public ArrayList<Integer> preorderTraversal(TreeNode root) {
        ArrayList<Integer> result = new ArrayList<Integer>();
        TreeNode p = root, q = null;
        while (p != null) {
            if (p.left == null) {   // Empty left subtree
                result.add(p.val);  // Access the value of current node
                p = p.right;
            } else {
                // Find in-order predecessor of current node
                q = p.left;
                while (q.right != null && q.right != p)
                    q = q.right;
 
                if (q.right == null) {  // Its left subtree has not been traversed; link it to its predecessor
                    q.right = p;
                    result.add(p.val);  // Access the value of current node
                    p = p.left;
                } else {    // Its left subtree has been traversed; recover tree structure
                    q.right = null;
                    p = p.right;
                }
            }
        }
        return result;
    }
Iterative: Using Stack
public ArrayList<Integer> preorderTraversal(TreeNode root) {
        ArrayList<Integer> result = new ArrayList<Integer>();
        if (root == null)
            return result;
        Deque<TreeNode> stack = new ArrayDeque<TreeNode>();     // Used to restore parents
        TreeNode p = root;
        while (p != null || !stack.isEmpty()) {
            if (p != null) {    // Whenever we meet a node, push it into the stack and go to its left subtree
                stack.push(p);
                result.add(p.val);
                p = p.left;
            } else {    // Left subtree has been traversed, add the value of current node, and go to its right subtree
                p = stack.pop();
                p = p.right;
            }
        }
        return result;
    }
Recursive
private void recursivePreorderTraversal(TreeNode root, ArrayList<Integer> result) {
        if (root == null)
            return;
        result.add(root.val); 
        recursivePreorderTraversal(root.left, result); 
        recursivePreorderTraversal(root.right, result);
    }
Read full article from LeetCode - Binary Tree Preorder Traversal | Darren's Blog

No comments:

Post a Comment

Labels

Algorithm (219) Lucene (130) LeetCode (97) Database (36) Data Structure (33) text mining (28) Solr (27) java (27) Mathematical Algorithm (26) Difficult Algorithm (25) Logic Thinking (23) Puzzles (23) Bit Algorithms (22) Math (21) List (20) Dynamic Programming (19) Linux (19) Tree (18) Machine Learning (15) EPI (11) Queue (11) Smart Algorithm (11) Operating System (9) Java Basic (8) Recursive Algorithm (8) Stack (8) Eclipse (7) Scala (7) Tika (7) J2EE (6) Monitoring (6) Trie (6) Concurrency (5) Geometry Algorithm (5) Greedy Algorithm (5) Mahout (5) MySQL (5) xpost (5) C (4) Interview (4) Vi (4) regular expression (4) to-do (4) C++ (3) Chrome (3) Divide and Conquer (3) Graph Algorithm (3) Permutation (3) Powershell (3) Random (3) Segment Tree (3) UIMA (3) Union-Find (3) Video (3) Virtualization (3) Windows (3) XML (3) Advanced Data Structure (2) Android (2) Bash (2) Classic Algorithm (2) Debugging (2) Design Pattern (2) Google (2) Hadoop (2) Java Collections (2) Markov Chains (2) Probabilities (2) Shell (2) Site (2) Web Development (2) Workplace (2) angularjs (2) .Net (1) Amazon Interview (1) Android Studio (1) Array (1) Boilerpipe (1) Book Notes (1) ChromeOS (1) Chromebook (1) Codility (1) Desgin (1) Design (1) Divide and Conqure (1) GAE (1) Google Interview (1) Great Stuff (1) Hash (1) High Tech Companies (1) Improving (1) LifeTips (1) Maven (1) Network (1) Performance (1) Programming (1) Resources (1) Sampling (1) Sed (1) Smart Thinking (1) Sort (1) Spark (1) Stanford NLP (1) System Design (1) Trove (1) VIP (1) tools (1)

Popular Posts