本题其实不算太难,不过我被标签 Dynamic Programming迷惑了,反倒没有往Recursive的方向努力想。
Dynamic Programming也是可以解出来的,近似于Unique Binary Search Trees,但是有缺点:
- 当构建新的Tree的时候,可以利用之前的数,但是需要给一个offset,并且克隆,其实这样就用了更多的空间
- 相比Recursive,Dynamic Programming是手动memorize一些东西,节省时间,浪费空间(如果忽略recursive本身用的空间)。但是本题时间上,空间上表现都会更差
本题不分析时间空间复杂度
代码也比较好懂,解释半天反倒变复杂了,非常常规的Recurseive题目:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public List<TreeNode> generateTrees(int n) {
if (n == 0) {
return new ArrayList<>();
}
return helper(1, n);
}
private List<TreeNode> helper(int start, int end) {
List<TreeNode> subResult = new ArrayList<>();
if (start > end) {
subResult.add(null);
}
else {
for (int index = start; index <= end; ++index) {
List<TreeNode> leftLst = helper(start, index - 1);
List<TreeNode> rightLst = helper(index + 1, end);
for (TreeNode l : leftLst) {
for (TreeNode r : rightLst) {
TreeNode root = new TreeNode(index);
root.left = l;
root.right = r;
subResult.add(root);
}
}
}
}
return subResult;
}
}