--- Difficulty: Medium Source: 160 Days of Problem Solving Tags: - Tree --- # 🚀 _Day 5. Construct Tree from Inorder & Preorder_ 🧠 The problem can be found at the following link: [Question Link](https://www.geeksforgeeks.org/batch/gfg-160-problems/track/tree-gfg-160/problem/construct-tree-1) ## 💡 **Problem Description:** Given two arrays representing the inorder and preorder traversals of a binary tree, construct the tree and return the root node of the constructed tree. **Note:** The output is written in postorder traversal. ## 🔍 **Example Walkthrough:** ### **Example 1:** #### **Input:** ``` inorder[] = [1, 6, 8, 7] preorder[] = [1, 6, 7, 8] ``` #### **Output:** ``` [8, 7, 6, 1] ``` #### **Explanation:** The constructed binary tree’s postorder traversal is `[8, 7, 6, 1]`. ### **Example 2:** #### **Input:** ``` inorder[] = [3, 1, 4, 0, 2, 5] preorder[] = [0, 1, 3, 4, 2, 5] ``` #### **Output:** ``` [3, 4, 1, 5, 2, 0] ``` #### **Explanation:** The constructed binary tree’s postorder traversal is `[3, 4, 1, 5, 2, 0]`. ### **Example 3:** #### **Input:** ``` inorder[] = [2, 5, 4, 1, 3] preorder[] = [1, 4, 5, 2, 3] ``` #### **Output:** ``` [2, 5, 4, 3, 1] ``` #### **Explanation:** The constructed binary tree’s postorder traversal is `[2, 5, 4, 3, 1]`. ### **Constraints:** - 1 ≤ number of nodes ≤ $10^3$ - 0 ≤ node->data ≤ $10^3$ - Both inorder and preorder arrays contain unique values. ## 🎯 **My Approach:** ### **Recursive Construction with Hash Map** 1. **Identify the Root:** - The first element in the `preorder` array is always the root of the tree. 2. **Index Lookup Using Hash Map:** - Build a hash map that stores the index of each element in the `inorder` array for O(1) lookups. 3. **Recursive Tree Construction:** - Using the current root from `preorder`, find its index in `inorder`. - Recursively construct the left subtree with the elements to the left of the root in `inorder`. - Recursively construct the right subtree with the elements to the right of the root in `inorder`. 4. **Output Generation:** - Once the tree is constructed, its postorder traversal represents the expected output. ## 🕒 **Time and Auxiliary Space Complexity** - **Expected Time Complexity:** `O(N)`, as every node is processed exactly once. - **Expected Auxiliary Space Complexity:** `O(N)`, mainly due to the recursion stack (in the worst-case scenario for a skewed tree) and the hash map used for index storage. ## 📝 **Solution Code** ## **Code (C++)** ```cpp class Solution { public: int i = 0; unordered_map m; Node* buildTree(vector& inorder, vector& preorder) { for (int j = 0; j < inorder.size(); j++) m[inorder[j]] = j; function f = [&](int l, int r) -> Node* { if (l > r) return nullptr; Node* root = new Node(preorder[i++]); root->left = f(l, m[root->data] - 1); root->right = f(m[root->data] + 1, r); return root; }; return f(0, inorder.size() - 1); } }; ```

🌲 Alternative Approaches

## **2️⃣ Iterative (Using Stack)** ```cpp class Solution { public: Node* buildTree(vector& inorder, vector& preorder) { if(preorder.empty()) return nullptr; Node* root = new Node(preorder[0]); stack s; s.push(root); int inIndex = 0; for (int i = 1; i < preorder.size(); i++) { Node* node = s.top(); if (node->data != inorder[inIndex]) { node->left = new Node(preorder[i]); s.push(node->left); } else { while(!s.empty() && s.top()->data == inorder[inIndex]) { node = s.top(); s.pop(); inIndex++; } node->right = new Node(preorder[i]); s.push(node->right); } } return root; } }; ``` ## **3️⃣ Recursive (Traditional)** ```cpp class Solution { unordered_map m; int i; Node* f(vector& pre, vector& in, int l, int r) { if (l > r) return nullptr; Node* root = new Node(pre[i++]); int idx = m[root->data]; root->left = f(pre, in, l, idx - 1); root->right = f(pre, in, idx + 1, r); return root; } public: Node* buildTree(vector& inorder, vector& preorder) { i = 0; for (int j = 0; j < inorder.size(); j++) m[inorder[j]] = j; return f(preorder, inorder, 0, inorder.size() - 1); } }; ``` ## **Comparison of Approaches** | Approach | Time Complexity | Space Complexity | Method | Pros | Cons | | --------------------------- | --------------- | ---------------- | ------------------ | ----------------------------------------------- | ---------------------------------------------------- | | **Recursive (Lambda)** | 🟢 **O(N)** | 🟡 **O(N)** | Recursion (Lambda) | Clean, concise, minimal code footprint | May hit recursion limits on very deep trees | | **Iterative (Stack)** | 🟢 **O(N)** | 🟡 **O(N)** | Stack-based | Avoids recursion depth issues; explicit control | Slightly more complex to implement | | **Recursive (Traditional)** | 🟢 **O(N)** | 🟡 **O(N)** | Recursion | Straightforward and familiar recursive pattern | Recursion stack may overflow in worst-case scenarios | ### **Best Choice?** - **For balanced trees**, the **Recursive (Lambda)** approach is ideal. - **For deep or skewed trees**, the **Iterative (Stack)** approach is recommended. - **For general usage with simplicity**, the **Recursive (Traditional)** approach works well.
## Code (Java) ```java class Solution { public static Node buildTree(int[] inorder, int[] preorder) { HashMap m = new HashMap<>(); for (int i = 0; i < inorder.length; i++) m.put(inorder[i], i); int[] idx = new int[1]; return build(0, inorder.length - 1, preorder, m, idx); } static Node build(int l, int r, int[] pre, HashMap m, int[] idx) { if(l > r) return null; Node root = new Node(pre[idx[0]++]); root.left = build(l, m.get(root.data) - 1, pre, m, idx); root.right = build(m.get(root.data) + 1, r, pre, m, idx); return root; } } ``` ## Code (Python) ```python class Solution: def buildTree(self, inorder, preorder): m = {v: i for i, v in enumerate(inorder)} self.i = 0 def f(l, r): if l > r: return None root = Node(preorder[self.i]) self.i += 1 pos = m[root.data] root.left = f(l, pos - 1) root.right = f(pos + 1, r) return root return f(0, len(inorder) - 1) ``` ## 🎯 **Contribution and Support:** For discussions, questions, or doubts related to this solution, feel free to connect on LinkedIn: [Any Questions](https://www.linkedin.com/in/patel-hetkumar-sandipbhai-8b110525a/). Let’s make this learning journey more collaborative! ⭐ If you find this helpful, please give this repository a star! ⭐ ---

📍Visitor Count