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



Given inorder and postorder traversal of a tree, construct the binary tree
public TreeNode buildTree(int[] inorder, int[] postorder) {
        if (postorder == null || inorder == null ||
                postorder.length != inorder.length || postorder.length == 0)
            return null;
        return recursiveBuildTree(postorder, 0, inorder, 0, postorder.length);
    }
 
    /**
     * Recursively build binary tree from postorder traversal and inorder traversal with given begining
     * indices of beginning nodes and effective number of nodes
     * @param postorder postorder traversal
     * @param postBegin index of the beginning node in the postorder 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[] postorder, int postBegin, int[] inorder, int inBegin, int len) {
        assert postBegin+len <= postorder.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(postorder[postBegin+len-1]);
 
        // 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 postBegin, inBegin, and len
        TreeNode left = recursiveBuildTree(postorder, postBegin, inorder, inBegin, leftTreeLen);
        TreeNode right = recursiveBuildTree(postorder, postBegin+leftTreeLen, inorder, inBegin+leftTreeLen+1,
                len-leftTreeLen-1);
 
        // Link the left and right subtrees with the root
        root.left = left;
        root.right = right;
 
        return root;
    }
Read full article from LeetCode - Construct Binary Tree from Inorder and Postorder 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