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 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| class Solution { public: TreeNode* reConstructBinaryTree(vector<int>& pre, vector<int>& in) { unordered_map<int, int> num2index; for (int i = 0; i < in.size(); i ++) { num2index.insert({in[i], i}); } return reConstructBinaryTreeCore(num2index, pre, 0, pre.size() - 1, in, 0, in.size() - 1); }
TreeNode* reConstructBinaryTreeCore(unordered_map<int, int> num2index, vector<int>& pre, int pl, int pr, vector<int>& in, int il, int ir) { if (pl > pr || il > ir) return nullptr;
TreeNode* root = new TreeNode(pre[pl]); int in_root_index = num2index[root->val]; root->left = reConstructBinaryTreeCore(num2index, pre, pl + 1, pl + in_root_index - il, in, il, in_root_index - 1); root->right = reConstructBinaryTreeCore(num2index, pre, pl + in_root_index - il + 1, pr, in, in_root_index + 1, ir); return root; } };
class Solution { public: TreeNode* reConstructBinaryTree(vector<int>& pre, vector<int>& in) { if (pre.size() == 0 || in.size() == 0) return nullptr;
TreeNode* rootNode = new TreeNode(pre[0]); int mid = distance(begin(in), find(in.begin(), in.end(), pre[0])); vector<int> pre_left(pre.begin() + 1, pre.begin() + mid + 1); vector<int> pre_right(pre.begin() + mid + 1, pre.end()); vector<int> in_left(in.begin(), in.begin() + mid); vector<int> in_right(in.begin() + mid + 1, in.end());
rootNode->left = reConstructBinaryTree(pre_left, in_left); rootNode->right = reConstructBinaryTree(pre_right, in_right); return rootNode; } };
|