import java.util.*;
/*
* public class TreeNode {
* int val = 0;
* TreeNode left = null;
* TreeNode right = null;
* public TreeNode(int val) {
* this.val = val;
* }
* }
*/
/**
* NC415 不同的二叉搜索树(二)
* @author d3y1
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param n int整型
* @return TreeNode类ArrayList
*/
public ArrayList<TreeNode> BSTgenerate (int n) {
return dp(1, n);
}
/**
* 动态规划 + 递归
*
* dp(m,n)表示区间[m,n]节点构成互不相同二叉搜索树的种数
*
* dp(m,n) = dp(m,m-1)*dp(m+1,n) + dp(m,m)*dp(m+2,n) + ... + dp(m,n-1)*dp(n+1,n)
*
* @param m
* @param n
* @return
*/
private ArrayList<TreeNode> dp(int m, int n){
ArrayList<TreeNode> list = new ArrayList<TreeNode>();
if(m > n){
// 必须
list.add(null);
return list;
}
for(int i=m; i<=n; i++){
ArrayList<TreeNode> leftRoots = dp(m, i-1);
ArrayList<TreeNode> rightRoots = dp(i+1, n);
for(TreeNode lRoot: leftRoots){
for(TreeNode rRoot: rightRoots){
TreeNode root = new TreeNode(i);
root.left = lRoot;
root.right = rRoot;
list.add(root);
}
}
}
return list;
}
}