LeetCode - Construct Binary Tree from Preorder and Inorder Traversal | Darren's Blog



Given preorder and inorder traversal of a tree, construct the binary tree
 public TreeNode buildTree(int[] preorder, int[] inorder) {
        if (preorder == null || inorder == null ||
                preorder.length != inorder.length || preorder.length == 0)
            return null;
        return recursiveBuildTree(preorder, 0, inorder, 0, preorder.length);
    }
    /**
     * Recursively build binary tree from preorder traversal and inorder traversal with given begining
     * indices of beginning nodes and effective number of nodes
     * @param preorder preorder traversal
     * @param preBegin index of the beginning node in the preorder traversal
     * @param inorder inorder traversal
     * @param inBegin index of the begining node in the inorder traversal
     * @param len number of nodes for both traversal
     * @return
     */
    private TreeNode recursiveBuildTree(int[] preorder, int preBegin, int[] inorder, int inBegin, int len) {
        assert preBegin+len <= preorder.length;
        assert inBegin+len <= inorder.length;
        if (len <= 0)       // Empty tree
            return null;
        // The beginning node in the preorder traversal is the root
        TreeNode root = new TreeNode(preorder[preBegin]);
        // Find the position of the root in the inorder traversal so as to decide the number of nodes
        // in its left subtree
        int leftTreeLen = 0;
        for(; leftTreeLen < len && inorder[inBegin+leftTreeLen] != root.val; leftTreeLen++);
        // Recursively build its left subtree and right subtree; note the change in preBegin, inBegin, and len
        TreeNode left = recursiveBuildTree(preorder, preBegin+1, inorder, inBegin, leftTreeLen);
        TreeNode right = recursiveBuildTree(preorder, preBegin+leftTreeLen+1, inorder, inBegin+leftTreeLen+1,
                len-leftTreeLen-1);
        // Link the left and right subtrees with the root
        root.left = left;
        root.right = right;
        return root;
    }
The running time T(n) satisfies the following relation:
T(n)=T(l)+T(nl1)+O(n).

When the tree is quite balanced, the time complexity is O(n) . But in case where the tree is very unbalanced (e.g. each node except the root is the right/left child of its parent), the time complexity grows up to O(n2) 
Read full article from LeetCode - Construct Binary Tree from Preorder and Inorder 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