Leetcode 不同的二叉搜索树II

不同的二叉搜索树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作为根节点的选择,然后将满足二叉搜索树条件的左子树作为其左节点,满足二叉搜索树条件的右子树作为其右节点。最终返回即可结果。详细请看代码,有疑问欢迎留言。

猜你喜欢

转载自blog.csdn.net/weixin_43914658/article/details/114260164