LeetCode 95 不同的二叉搜索树II
问题描述:
给定一个整数 n,生成所有由 1 ... n 为节点所组成的 二叉搜索树 。
执行用时:1 ms, 在所有 Java 提交中击败了99.97%的用户
内存消耗:40.4 MB, 在所有 Java 提交中击败了49.34%的用户
class Solution {
public List<TreeNode> generateTrees(int n) {
if(n==0) return new ArrayList<TreeNode>();
List<TreeNode> ans = generateTrees(1, n);
return ans;
}
//产生[start, end] (satrt>=1, end<=n, start<=end) 范围内所有节点组成的二叉搜索树集合
public List<TreeNode> generateTrees(int start, int end) {
List<TreeNode> ans = new ArrayList<TreeNode>();
//递归终止(空树、单节点)
if(start > end) {
ans.add(null);
return ans;
}
//(记忆化, 需要记录[i,j]范围内的子树集合, 一共有n(n+1)/2个)递归过程
for(int rootVal=start; rootVal<=end; rootVal++){
//获取左右子树集合
List<TreeNode> leftTreesList = generateTrees(start, rootVal-1);
List<TreeNode> rightTreesList = generateTrees(rootVal+1, end);
//拼接
for(int i=0; i<leftTreesList.size(); i++){
for(int j=0; j<rightTreesList.size(); j++){
TreeNode root = new TreeNode(rootVal);
root.left = leftTreesList.get(i);
root.right = rightTreesList.get(j);
ans.add(root);
}
}
}
//返回值
return ans;
}
}