链接:
https://leetcode.com/problems/unique-binary-search-trees-ii/
大意:
给定一个整数n,要求出以1~n为树节点值的所有BST(所有树的根节点)
思路:
一开始想着用回溯...回了半天,没解决(好菜啊...)
随后看了通过的代码,发现是使用分治+递归。
认真地看了看,真的是巧妙啊。。。 再一次感觉自己好菜啊。。。
代码:
class Solution {
public List<TreeNode> generateTrees(int n) {
if(n == 0)
return new LinkedList<TreeNode>();
return generateTrees(1,n);
}
// 整个函数的功能是返回由start~end组成的所有bst
public List<TreeNode> generateTrees(int start,int end) {
List<TreeNode> res = new LinkedList<TreeNode>();
// 跳出递归的条件
if(start > end){
res.add(null);
return res;
}
for(int i = start;i <= end;i++){
// 分治
List<TreeNode> subLeftTree = generateTrees(start,i-1);
List<TreeNode> subRightTree = generateTrees(i+1,end);
// 确定子树root的左孩子和右孩子 通过对subLeftTree和subRightTree各个元素组合而得
for(TreeNode left : subLeftTree){
for(TreeNode right : subRightTree){
TreeNode node = new TreeNode(i);
node.left = left;
node.right = right;
res.add(node);
}
}
}
return res; // 最终返回的res为以各个数字为根节点所形成的所有树
}
}
结果:
结论:
菜鸡还得更加努力。