Leetcode JAVA刷刷站(95)不同的二叉搜索数 ||

一、题目概述

二、思路方向

       为了生成所有由 n 个节点(值从 1 到 n)组成的不同二叉搜索树(BST),我们可以采用递归的方式。核心思想在于,对于每个数字 i(从 1 到 n),我们可以将其视为根节点,然后递归地生成其左子树(由 1 到 i-1 的数字组成)和右子树(由 i+1 到 n 的数字组成)。

三、代码实现 

import java.util.ArrayList;  
import java.util.List;  
  
class TreeNode {  
    int val;  
    TreeNode left;  
    TreeNode right;  
  
    TreeNode(int val) {  
        this.val = val;  
    }  
}  
  
public class Solution {  
    public List<TreeNode> generateTrees(int n) {  
        if (n == 0) {  
            return new ArrayList<>();  
        }  
        return generateTrees(1, n);  
    }  
  
    private List<TreeNode> generateTrees(int start, int end) {  
        List<TreeNode> allTrees = new ArrayList<>();  
        if (start > end) {  
            allTrees.add(null); // 空树  
            return allTrees;  
        }  
  
        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;  
                    allTrees.add(root);  
                }  
            }  
        }  
  
        return allTrees;  
    }  
  
    public static void main(String[] args) {  
        Solution solution = new Solution();  
        List<TreeNode> trees = solution.generateTrees(3);  
        // 打印生成的所有二叉搜索树(这里只是演示如何调用,具体如何打印二叉树结构需要自定义)  
        // 注意:直接打印 TreeNode 对象不会显示树的结构,需要自定义打印逻辑  
    }  
}

执行结果: 

四、小结 

       注意:上述代码只是生成了所有可能的二叉搜索树,并没有提供打印二叉树结构的代码。打印二叉树结构通常需要递归遍历树,并逐层或按其他方式输出节点值。

       此外,上述解决方案的时间复杂度较高,因为它涉及到大量的递归调用和树的生成。对于较大的 n,生成所有可能的二叉搜索树可能会变得非常耗时和占用大量内存。因此,在处理大规模数据时,需要考虑更高效的算法或优化方法。

 结语  

祝福你前程广阔,如同星辰大海,无边无际

愿你的梦想之舟,乘风破浪,直抵心中的彼岸

!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT 青年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值