public List<TreeNode> generateTreesDP(int n, Map<Integer, List<TreeNode>> DP) {
		ArrayList<TreeNode> res = new ArrayList<TreeNode>();
		if(n == 0) {
			res.add(null);
			return res;
		}
		if(DP.containsKey(n)) return DP.get(n);

		for(int i = 1; i <= n; ++i){
			List<TreeNode> ls = generateTreesDP(i-1, DP);
			List<TreeNode> rs = generateTreesDP(n-i, DP);
			for(TreeNode r : rs) {
				for(TreeNode l : ls){
					TreeNode node = new TreeNode(i);
                    node.left = l;
                    node.right = r;
					res.add(node);
				}
			}
		}
		DP.put(n, res);
		return DP.get(n);
	}