--- tags: leetcode --- # [889. Construct Binary Tree from Preorder and Postorder Traversal](https://leetcode.com/problems/construct-binary-tree-from-preorder-and-postorder-traversal/) --- # My Solution ## The Key Idea for Solving This Coding Question ## C++ Code ```cpp= /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} * }; */ class Solution { public: TreeNode *constructFromPrePost(vector<int> &preorder, vector<int> &postorder) { for (int i = 0; i < postorder.size(); ++i) { postValToIdx[postorder[i]] = i; } return buildTree(preorder, 0, preorder.size() - 1, postorder, 0, postorder.size() - 1); } private: unordered_map<int, int> postValToIdx; TreeNode *buildTree(vector<int> &preorder, int preHead, int preTail, vector<int> &postorder, int postHead, int postTail) { if (preHead > preTail) { return nullptr; } TreeNode *node = new TreeNode(preorder[preHead]); if (preHead == preTail) { return node; } int postLeftRoot = postValToIdx[preorder[preHead + 1]]; int leftSize = postLeftRoot - postHead + 1; node->left = buildTree(preorder, preHead + 1, preHead + leftSize, postorder, postHead, postLeftRoot); node->right = buildTree(preorder, preHead + leftSize + 1, preTail, postorder, postLeftRoot + 1, postTail - 1); return node; } }; ``` ## Time Complexity ## Space Complexity # Miscellaneous [105. Construct Binary Tree from Preorder and Inorder Traversal](https://leetcode.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/) <!-- # Test Cases ``` [1,2,4,5,3,6,7] [4,5,2,6,7,3,1] ``` ``` [1] [1] ``` ``` [2,1] [1,2] ``` -->