https://leetcode.com/problems/unique-binary-search-trees-ii/#/description
Given an integer n, generate all structurally unique BST's (binary search trees) that store values 1...n.
For example,
Given n = 3, your program should return all 5 unique BST's shown below.
1 3 3 2 1 \ / / / \ \ 3 2 1 1 3 2 / / \ \ 2 1 2 3
package go.jacob.day712;
import java.util.ArrayList;
import java.util.List;
public class Demo2 {
/*
* Solution with DP
*/
public List<TreeNode> generateTrees(int n) {
List<TreeNode>[] res = new List[n + 1];
res[0] = new ArrayList<TreeNode>();
if (n <= 0)
return res[0];
// 必须add(null),否则for (TreeNode left : res[0])
res[0].add(null);
for (int i = 1; i <= n; i++) {
res[i] = new ArrayList<TreeNode>();
for (int j = 1; j <= i; j++) {
for (TreeNode left : res[j - 1]) {
for (TreeNode right : res[i - j]) {
TreeNode node = new TreeNode(j);
node.left = left;
node.right = clone(right, j);
res[i].add(node);
}
}
}
}
return res[n];
}
private TreeNode clone(TreeNode n, int offset) {
if (n == null)
return null;
TreeNode node = new TreeNode(n.val + offset);
node.left = clone(n.left, offset);
node.right = clone(n.right, offset);
return node;
}
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
}