95. Unique Binary Search Trees II
Given an integer n, generate all structurally unique BST's (binary search trees) that store values 1 ... n.
Example:
Input: 3 Output: [ [1,null,3,2], [3,2,null,1], [3,1,null,null,2], [2,1,3], [1,null,2,null,3] ] Explanation: The above output corresponds to the 5 unique BST's shown below: 1 3 3 2 1 \ / / / \ \ 3 2 1 1 3 2 / / \ \ 2 1 2 3
思路:递归来做。每次传入两个数low high去构造子树。每次的子数又可以以low:high之间的整数作为头结点。因此以不同节点递归构造出左子树的情况、右子树的情况、再对每种情况声明一个新的头结点,两个for循环遍历左子树的情况和右子树的情况,把他们分别接到头结点上,再把这个头结点加到vector<TreeNode*>里。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<TreeNode*> generateTreesInRange(int low, int high) const {
if(low==high)
return {new TreeNode(low)};
else if(high<low)
{
return {nullptr};
}
vector<TreeNode*>ret;
for(int root_val=low;root_val<=high;root_val++)
{
auto left_combos=generateTreesInRange(low,root_val-1);
auto right_combos=generateTreesInRange(root_val+1,high);
for(auto l:left_combos)
{
for(auto r:right_combos)
{
auto t=new TreeNode(root_val); //每次都要重新申明一个情况的指针
t->left=l;
t->right=r;
ret.push_back(t);
}
}
}
return ret;
}
vector<TreeNode*> generateTrees(int n) {
if(n<1)
return {};
return generateTreesInRange(1,n);
}
};