不同的二叉搜索树II
题目描述:
给定一个整数 n,生成所有由 1 ... n 为节点所组成的 二叉搜索树。提示:0 <= n <= 8
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public List<TreeNode> generateTrees(int n) {
if (n == 0) {
// 特殊情况判断
return new ArrayList<TreeNode>();
}
return generateTrees(1, n);
}
// 该方法定义为获取二叉搜索子树的集合
public List<TreeNode> generateTrees(int start, int end) {
List<TreeNode> result = new ArrayList<TreeNode>();
if (start > end) {
// 递归结束条件
result.add(null);
return result;
}
for(int i = start; i <= end; i++){
// 遍历所有可能根节点
// 获得所有左子树的搜索二叉树集合
List<TreeNode> leftTrees = generateTrees(start, i - 1);
// 获得所有右子树的搜索二叉树集合
List<TreeNode> rightTrees = generateTrees(i + 1, end);
// 从左子树集合中选出一棵左子树,从右子树集合中选出一棵右子树,拼接到根节点上
for (TreeNode left : leftTrees) {
for (TreeNode right : rightTrees) {
TreeNode root = new TreeNode(i); // 根节点
root.left = left;
root.right = right;
result.add(root);
}
}
}
return result;
}
}
参考官方的题解,我们首先要明确二叉搜索树是什么,按照其定义: 根节点的值大于左子树所有节点的值,小于右子树所有节点的值,且左子树和右子树也同样为二叉搜索树。
因此,我们可以定义generateTrees(start, end) 函数表示当前值的集合为 [start,end] ,返回序列 [start,end] 生成的所有满足条件的二叉搜索树。然后我们遍历start到end作为根节点的选择,然后将满足二叉搜索树条件的左子树作为其左节点,满足二叉搜索树条件的右子树作为其右节点。最终返回即可结果。详细请看代码,有疑问欢迎留言。