/* * 95. Unique Binary Search Trees II * 2016-5-14 By Mingyang * 分成两个函数来写,另外一个函数写满起点到终点 * 这个题目自己写的代码很有收获 * 1.最开始的判断n<1必须加上,不然会报错,Input:0 Output:[[]] Expected:[] * 2.if (start > end) * {list.add(null); * return list; * 这步很重要,最关键的串联一步,如果没有那就返回null,直接串联 */ public List<TreeNode> generateTrees(int n) { List<TreeNode> res=new ArrayList<TreeNode>(); if(n<1)//这不能少 return res; return generateTrees(1, n); } public List<TreeNode> generateTrees(int start, int end) { List<TreeNode> list = new LinkedList<TreeNode>(); if (start > end) { //最开始我也错了,直接返回list,必须返回null,不然人家才能串联起来,node.left=null; list.add(null); return list; } for (int i = start; i <= end; i++) { List<TreeNode> lefts = generateTrees(start, i - 1);//以i作为根节点,左子树由[1,i-1]构成 List<TreeNode> rights = generateTrees(i + 1, end);//右子树由[i+1, n]构成 for (TreeNode left : lefts) {//左边和右边分别返回了一个list,每个值就是一个TreeNode,就代表一种可能性 for (TreeNode right : rights) { TreeNode node = new TreeNode(i); node.left = left; node.right = right; list.add(node);//存储所有可能行 } } } return list; }