Loading

【leetcode】95. Unique Binary Search Trees II

Given an integer n, return all the structurally unique BST's (binary search trees), which has exactly n nodes of unique values from 1 to n. Return the answer in any order.
 
Example 1:

 

Input: n = 3 Output: [[1,null,2,null,3],[1,null,3,2],[2,1,3],[3,1,null,null,2],[3,2,null,1]]
Example 2:
Input: n = 1 Output: [[1]]
   这题我第一次没做出来,参考了下面这位大佬的解题思路:参考答案:https://www.cnblogs.com/grandyang/p/4301096.html
  这道题是之前的 Unique Binary Search Trees 的延伸,之前那个只要求算出所有不同的二叉搜索树的个数,这道题让把那些二叉树都建立出来。这种建树问题一般来说都是用递归来解,这道题也不例外,划分左右子树,递归构造。这个其实是用到了大名鼎鼎的分治法 Divide and Conquer,类似的题目还有之前的那道 Different Ways to Add Parentheses 用的方法一样,用递归来解,划分左右两个子数组,递归构造。刚开始时,将区间 [1, n] 当作一个整体,然后需要将其中的每个数字都当作根结点,其划分开了左右两个子区间,然后分别调用递归函数,会得到两个结点数组,接下来要做的就是从这两个数组中每次各取一个结点,当作当前根结点的左右子结点,然后将根结点加入结果 res 数组中即可,参见代码如下:
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    vector<TreeNode*> generateTrees(int n) {
        
        //这种题目感觉存的数据结果 有点麻烦啊 递归? 返回的是头结点的地址 真要把树都建起来?
        //感觉 需要用递归 但是不会写 建树的问题一般都用递归来求解
        if(n==0) return {};
        return helper(1,n); 
        
    }
    vector<TreeNode*>helper(int start,int end){
        if(start>end) return {nullptr};
        vector<TreeNode*> res;
        for(int i=start;i<=end;++i)
        {
            auto left=helper(start,i-1),right=helper(i+1,end);
            for(auto a:left)
            {
                for(auto b:right)
                {
                    TreeNode *node=new TreeNode(i);
                    node->left=a;
                    node->right=b;//这是如何保证是二叉搜索树的 右边永远打 左边永远小
                    res.push_back(node);
                }
            }
        }
        return res;
    }
};

 

posted @ 2021-11-19 16:26  aalanwyr  阅读(19)  评论(0编辑  收藏  举报