【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; } };