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
|
class Solution { public: TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) { return buildTreeHelper(preorder, 0, preorder.size() - 1, inorder, 0, inorder.size() - 1); } TreeNode* buildTreeHelper(vector<int>& preorder, size_t l1, size_t r1, vector<int>& inorder, size_t l2, size_t r2) { if (l1 > r1 || l2 > r2) return nullptr; if (l1 == r1) return new TreeNode(preorder[l1]); auto root_iter = find(inorder.cbegin(), inorder.cend(), preorder[l1]); size_t root_pos = root_iter - inorder.begin(); size_t left_size = root_pos - l2, right_size = r2 - root_pos; TreeNode* root = new TreeNode(preorder[l1]); root->left = buildTreeHelper(preorder, l1 + 1, l1 + left_size, inorder, l2, root_pos - 1); root->right = buildTreeHelper(preorder, l1 + left_size + 1, r1, inorder, root_pos + 1, r2); return root; } };
C++
|