diff --git a/C++/Unique-Binary-Search-TreesII.cpp b/C++/Unique-Binary-Search-TreesII.cpp new file mode 100644 index 0000000000..e0de9e2fa2 --- /dev/null +++ b/C++/Unique-Binary-Search-TreesII.cpp @@ -0,0 +1,43 @@ +/** + * 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: + vector generateTrees(int n) + { + vector> dp(n + 1); + dp[0].emplace_back(nullptr); + for (int i = 1; i <= n; i++) + { + for (int j = 1; j <= i; j++) + { + for (auto l : dp[j - 1]) + { + for (auto r : dp[i - j]) { + auto m = new TreeNode(j, l, r); + dp[i].emplace_back(m); + } + } + } + } + function replace = [&] (TreeNode *&p, int val) + { + if (!p) return; + p = new TreeNode(p->val + val, p->left, p->right); + replace(p->left, val); + replace(p->right, p->val); + }; + for (auto &t : dp[n]) + replace(t, 0); + return dp[n]; + } +};