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
|
class Solution { private: unordered_map<int, int> index;
public: TreeNode* mybuildTree(vector<int>& preorder, vector<int>& inorder, int preorder_l, int preorder_r, int inorder_l, int inorder_r) { if (preorder_r <= preorder_l) return nullptr;
int root_val = preorder[preorder_l]; int root_idx = index[root_val]; int left_num = root_idx - inorder_l;
TreeNode* root = new TreeNode(root_val); root -> left = mybuildTree(preorder, inorder, preorder_l + 1, preorder_l + left_num + 1, inorder_l, inorder_l + left_num); root -> right = mybuildTree(preorder, inorder, preorder_l + left_num + 1, preorder_r, inorder_l + left_num + 1, inorder_r); return root; }
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) { int len = preorder.size(); for (int i = 0; i < len; ++i) { index[inorder[i]] = i; } return mybuildTree(preorder, inorder, 0, len, 0, len); } };
|