其他分享
首页 > 其他分享> > 力扣 题目95- 不同的二叉搜索树 II

力扣 题目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 }
View Code

 

 

 

标签:node,力扣,right,TreeNode,int,II,95,节点,left
来源: https://www.cnblogs.com/zx469321142/p/16495171.html