0
点赞
收藏
分享

微信扫一扫

Leetcode95. 不同的二叉搜索树 II


题目传送:​​https://leetcode.cn/problems/unique-binary-search-trees-ii/submissions/​​

运行效率:

Leetcode95. 不同的二叉搜索树 II_子树

代码如下:

public static List<TreeNode> generateTrees(int n) {
List<TreeNode> treeNodes = generateTrees(1, n);
return treeNodes;
}

/**
* 将start到end之间的数字组合成搜索二叉树
*
* @param start
* @param end
* @return List里的每一个元素都是一颗搜索二叉树
*/
public static List<TreeNode> generateTrees(int start, int end) {
List<TreeNode> result = new ArrayList<>();
//处理边界情况
if (start == end) {
TreeNode root = new TreeNode(start);
result.add(root);
return result;
}

//1、先确定二叉树根节点 (而根节点有可能是start到end之间的任何一个数字,所以我们枚举试试看)
for (int i = start; i <= end; i++) {
List<TreeNode> leftNodes = new ArrayList<>();
List<TreeNode> rightNodes = new ArrayList<>();
if (i - 1 >= start) {
leftNodes = generateTrees(start, i - 1);
}
if (i + 1 <= end) {
rightNodes = generateTrees(i + 1, end);
}
//二叉搜索树的左子树可以为空
if (leftNodes.isEmpty()) {
for (TreeNode right : rightNodes) {
TreeNode root = new TreeNode(i); //根节点
root.right = right;
result.add(root);
}
}
//二叉搜索树的右子树可以为空
if (rightNodes.isEmpty()) {
for (TreeNode left : leftNodes) {
TreeNode root = new TreeNode(i); //根节点
root.left = left;
result.add(root);
}
}

for (TreeNode left : leftNodes) {
for (TreeNode right : rightNodes) {
TreeNode root = new TreeNode(i); //根节点
root.left = left;
root.right = right;
result.add(root);
}
}
}
return result;
}


举报

相关推荐

0 条评论