码迷,mamicode.com
首页 > 其他好文 > 详细

95. 不同的二叉搜索树 II

时间:2020-04-01 01:02:26      阅读:63      评论:0      收藏:0      [点我收藏+]

标签:nbsp   返回   遍历   des   应该   back   solution   code   情况   

C++。思路如下:

对于连续整数序列[left, right]中的一点i,若要生成以i为根节点的BST,则有如下规律:
i左边的序列可以作为左子树结点,且左儿子可能有多个,所以有vector<TreeNode *> left_nodes = generate(left, i - 1);;
i右边的序列可以作为右子树结点,同上所以有vector<TreeNode *> right_nodes = generate(i + 1, right);;
产生的以当前i为根结点的BST(子)树有left_nodes.size() * right_nodes.size()个,遍历每种情况,即可生成以i为根节点的BST序列;
然后以for循环使得[left, right]中每个结点都能生成子树序列。
即如下代码:

for (int i = left; i <= right; i++) {
        vector<TreeNode *> left_nodes = generate(left, i - 1);
        vector<TreeNode *> right_nodes = generate(i + 1, right);
        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);
            }
        }
    }
一旦left大于right,则说明这里无法产生子树,所以此处应该是作为空结点返回:ans.push_back(NULL); return ans;;
返回[left, right]中生成的所有子树序列ans。
 
 1 class Solution 
 2 {
 3 public:
 4     vector<TreeNode *> generateTrees(int n) 
 5     {
 6         if (n) return generate(1, n);
 7         else return vector<TreeNode *>{};
 8     }
 9     
10     vector<TreeNode *> generate(int left, int right) 
11     {
12         vector<TreeNode *> ans;
13         if (left > right) 
14         {
15             ans.push_back(NULL);
16             return ans;
17         }
18         for (int i = left; i <= right; i++) 
19         {
20             vector<TreeNode *> left_nodes = generate(left, i - 1);
21             vector<TreeNode *> right_nodes = generate(i + 1, right);
22             for (TreeNode *left_node : left_nodes) 
23             {
24                 for (TreeNode *right_node : right_nodes) 
25                 {
26                     TreeNode *t = new TreeNode(i);
27                     t->left = left_node;
28                     t->right = right_node;
29                     ans.push_back(t);
30                 }
31             }
32         }
33         return ans;
34     }
35 };

 

95. 不同的二叉搜索树 II

标签:nbsp   返回   遍历   des   应该   back   solution   code   情况   

原文地址:https://www.cnblogs.com/yuhong1103/p/12609723.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!