ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

力扣 题目95- 不同的二叉搜索树 II

2022-07-19 18:34:51  阅读:133  来源: 互联网

标签:node 力扣 right TreeNode int II 95 节点 left


题目

题解

我们可以将一个大的二叉搜索树分成越来越小的二叉搜索树  那么问题是如何取左节点 与 右节点的可能性

也就是我们需要的做 便是如何找到左节点范围 右节点范围

二叉搜索树

//左节点比根节点小
//右节点比根节点大

//右节点下的子节点也比左节点的子节点大

//已经取过的不能再用

根据上面几条便可确定范围

当根节点为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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有