095_不同的二叉搜索树II
大约 1 分钟
095_不同的二叉搜索树II中等
class Solution {
public List<TreeNode> generateTrees(int n) {
if (n == 0) {
return new LinkedList<TreeNode>();
}
List<TreeNode> res = add(1, n);
return res;
}
public List<TreeNode> add(int left,int right){
List<TreeNode> res = new LinkedList<>();
if(left > right){
res.add(null);
return res;
}
for (int i = left; i <= right; i++) {
List<TreeNode> leftList = add(left, i - 1);
List<TreeNode> rightList = add(i + 1, right);
for (TreeNode leftTree : leftList) {
for (TreeNode rightTree : rightList) {
TreeNode root = new TreeNode(i);
root.left = leftTree;
root.right = rightTree;
res.add(root);
}
}
}
return res;
}
}
二叉搜索树关键的性质是根节点的值大于左子树所有节点的值,小于右子树所有节点的值,且左子树和右子树也同样为二叉搜索树。因此在生成所有可行的二叉搜索树的时候,假设当前序列长度为 nn,如果我们枚举根节点的值为 ii,那么根据二叉搜索树的性质我们可以知道左子树的节点值的集合为 [1…i−1],右子树的节点值的集合为 [i+1…n]。而左子树和右子树的生成相较于原问题是一个序列长度缩小的子问题,因此我们可以想到用回溯的方法来解决这道题目。
Powered by Waline v2.15.5