力扣 题目95- 不同的二叉搜索树 II
题目
题解
我们可以将一个大的二叉搜索树分成越来越小的二叉搜索树 那么问题是如何取左节点 与 右节点的可能性
也就是我们需要的做 便是如何找到左节点范围 右节点范围
二叉搜索树
//左节点比根节点小
//右节点比根节点大
//右节点下的子节点也比左节点的子节点大
//已经取过的不能再用
根据上面几条便可确定范围
当根节点为i时
左范围:[left,i-1] 这里的left一开始是0 由于数字用完就不能再用 需要+1(也就是循环)
右范围:[i+1,right] right是边界即n
当left > right 时也就是没有满足的值了就取null
当然可能性不止一种 我们在得到同一个i下的左集合与右集合 需要遍历组合
for (TreeNode* left_node : left_nodes) { for (TreeNode* right_node : right_nodes) { TreeNode* t = new TreeNode(i); t->left = left_node; t->right = right_node; ans.push_back(t); } } }
代码
1 #include<iostream> 2 #include<vector> 3 #include<stack> 4 using namespace std; 5 6 struct TreeNode { 7 int val; 8 TreeNode* left; 9 TreeNode* right; 10 TreeNode() : val(0), left(nullptr), right(nullptr) {} 11 TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} 12 TreeNode(int x, TreeNode* left, TreeNode* right) : val(x), left(left), right(right) {} 13 }; 14 //左节点比根节点小 15 //右节点比根节点大 16 class Solution { 17 public: 18 vector<TreeNode*> generateTrees(int n) { 19 if (n) return generate(1, n); 20 else return vector<TreeNode*>{}; 21 } 22 23 vector<TreeNode*> generate(int left, int right) { 24 vector<TreeNode*> ans; 25 if (left > right) { 26 ans.push_back(nullptr); 27 return ans; 28 } 29 for (int i = left; i <= right; i++) { 30 vector<TreeNode*> left_nodes = generate(left, i - 1); 31 vector<TreeNode*> right_nodes = generate(i + 1, right); 32 for (TreeNode* left_node : left_nodes) { 33 for (TreeNode* right_node : right_nodes) { 34 TreeNode* t = new TreeNode(i); 35 t->left = left_node; 36 t->right = right_node; 37 ans.push_back(t); 38 } 39 } 40 } 41 return ans; 42 } 43 }; 44 45 46 47 int main() { 48 Solution sol; 49 vector<TreeNode*> result = sol.generateTrees(3); 50 for (int i = 0; i < result.size(); i++) { 51 cout << result[i] << endl; 52 } 53 }