1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
|
class Solution { public: TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) { unordered_map<int, vector<int>::iterator> mp; for(vector<int>::iterator it = inorder.begin(); it != inorder.end(); ++it) mp.insert({*it,it}); return buildTree(mp, postorder.begin(), postorder.end(), inorder.begin(), inorder.end()); } private: TreeNode* buildTree(const unordered_map<int, vector<int>::iterator>& mp, vector<int>::iterator postorder_begin, vector<int>::iterator postorder_end, vector<int>::iterator inorder_begin, vector<int>::iterator inorder_end) { if(postorder_begin == postorder_end || inorder_begin == inorder_end) return nullptr; vector<int>::iterator inorder_parentNode= mp.find(*(postorder_end - 1)) -> second; int leftTreeNums = inorder_parentNode - inorder_begin; int rightTreeNums = inorder_end - inorder_parentNode - 1; TreeNode* res = new TreeNode(*inorder_parentNode); res->left = buildTree(mp, postorder_begin, postorder_begin + leftTreeNums, inorder_begin, inorder_parentNode); res->right = buildTree(mp, postorder_end - 1 - rightTreeNums, postorder_end - 1, inorder_parentNode + 1, inorder_end); return res; } };
|