【95. 不同的二叉搜索树 II】
【思路】
1…n 所有节点都可以是根节点,输出所有的可能
二叉搜索树,左子树<根节点<右子树
左子树和右子树同样也是小的二叉搜索树
因此左右子树生成相较于原问题是一个长度缩小的子问题==》【递归】
1…n 为节点组成的以 i 为根节点组成的二叉搜索树,
左子树(1…i-1) ,根 (i),右子树(i+1…n)
1、外层循环遍历 1~n 所有结点,作为根结点
2、内层双层递归分别求出左⼦树和右⼦树
【解题】 JAVA
class TreeNode {
int val;
TreeNode left;
TreeNode right;
public TreeNode() {
}
public TreeNode(int val) {
this.val = val;
}
public TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}
public List<TreeNode> generateTrees(int n) {
// 当n为0的时候,是一棵空树
if (n = 0) {
return null;
}
//1...n
return generateTrees(1,n);
}
private List<TreeNode> generateTrees(int start, int end) {
List<TreeNode> list = new ArrayList<>();
//边界条件,子树为空
if (start > end) {
list.add(null);
return list;
}
for (int i = start; i <= end ; i++) {
//左子树生成 (1,i-1)
List<TreeNode> leftList = generateTrees(start, i-1);
//右子树生成 (i+1, n)
List<TreeNode> rightList = generateTrees(i+1, end);
//左右子树拼接根节点
for (TreeNode left : leftList) {
for (TreeNode right :rightList) {
//根节点(i)
TreeNode root = new TreeNode(i);
root.left = left;
root.right = right;
list.add(root);
}
}
}
return list;
}
1
\
2
\
3
1 null 2 null 3 null null
1
\
3
/
2
1 null 3 2 null null null
2
/ \
1 3
2 1 null null 3 null null
3
/
1
\
2
3 1 null 2 null null null
3
/
2
/
1
3 2 1 null null null null
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/unique-binary-search-trees-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。