dp
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
|
class Solution { public: vector<TreeNode*> generateTrees(int n) { vector<vector<TreeNode*>> dp(n + 1); dp[0] = {nullptr}; for(size_t i = 1; i <= n; ++i) { for(size_t j = 1; j <= i; ++j) { for(auto& nodeLeft : dp[j - 1]) { for(auto& nodeRight : dp[i - j]) { TreeNode* tmp = new TreeNode(j); tmp->left = nodeLeft; tmp->right = clone(nodeRight, j); dp[i].push_back(tmp); } } } } return dp.back(); } private: TreeNode* clone(TreeNode* root, int offset) { if(!root) return nullptr; TreeNode* newNode = new TreeNode(root->val + offset); newNode->left = clone(root->left, offset); newNode->right = clone(root->right, offset); return newNode; } };
|
和Unique Binary Search Trees相似,只不过这个要列举出所有节点
递归分治
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
|
class Solution { public: vector<TreeNode*> generateTrees(int n) { return helper(1, n); } private: vector<TreeNode*> helper(int start, int end) { if(start > end) return { nullptr }; vector<TreeNode*> ret; for(int i = start; i <= end; ++i) { auto left = helper(start, i - 1); auto right = helper(i + 1, end); for(auto& l : left) { for(auto& r : right) { auto cur = new TreeNode(i); cur->left = l; cur->right = r; ret.push_back(cur); } } } return ret; } };
|
好难想
从下建立起树,然后往上走,连接