news 2026/9/13 7:59:06

千问 LeetCode 95. 不同的二叉搜索树 II Java实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
千问 LeetCode 95. 不同的二叉搜索树 II Java实现

LeetCode 95. 不同的二叉搜索树 II Java实现

题意:给整数 n ,生成由 1 ~ n 节点构成的所有不同二叉搜索树。
二叉搜索树:左子树全部 < 根,右子树全部 > 根。
思路:递归枚举根节点 i , [1,i‑1] 构造左子树集合, [i+1,n] 构造右子树集合,左右两两组合生成所有树。

TreeNode定义:

java

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;
}
}

完整代码

java

import java.util.ArrayList;
import java.util.List;

class Solution {
public List generateTrees(int n) {
if(n == 0) return new ArrayList<>();
return build(1, n);
}

// 生成 [l, r]区间所有BST private List<TreeNode> build(int l, int r) { List<TreeNode> res = new ArrayList<>(); // 空区间,返回null节点用于组合 if(l > r) { res.add(null); return res; } // 枚举每一个i作为根 for(int i = l; i <= r; i++) { List<TreeNode> leftTrees = build(l, i - 1); List<TreeNode> rightTrees = build(i + 1, r); // 左右子树笛卡尔积组合 for(TreeNode left : leftTrees) { for(TreeNode right : rightTrees) { TreeNode root = new TreeNode(i); root.left = left; root.right = right; res.add(root); } } } return res; }

}

核心要点

  1. 递归区间 [l,r] ,当 l>r 必须返回包含 null 的list,否则无法拼接左右子树;
  2. 根为 i ,左子树来自 [l,i‑1] 全部BST,右子树来自 [i+1,r] 全部BST;
  3. 双重循环做笛卡尔积,每一组左、右子树新建根节点组装;
  4. n=0返回空集合。

复杂度

  • 时间:O(G_n),G_n是第n个卡特兰数,卡特兰数量级O(\frac{4^n}{n\sqrt{n}})
  • 空间:O(G_n)存储全部树

进阶:记忆化DP优化(重复区间缓存)

java

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

class Solution {
private Map<String,List> memo;

public List<TreeNode> generateTrees(int n) { if(n == 0) return new ArrayList<>(); memo = new HashMap<>(); return build(1,n); } private List<TreeNode> build(int l, int r) { String key = l + "," + r; if(memo.containsKey(key)) return memo.get(key); List<TreeNode> res = new ArrayList<>(); if(l > r) { res.add(null); memo.put(key,res); return res; } for(int i=l;i<=r;i++){ List<TreeNode> left = build(l,i-1); List<TreeNode> right = build(i+1,r); for(TreeNode ln : left){ for(TreeNode rn : right){ TreeNode root = new TreeNode(i); root.left = ln; root.right = rn; res.add(root); } } } memo.put(key,res); return res; }

}

需要 Python / Rust / C++版本吗?

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/13 7:59:02

技术人十五年成长路径:从基础到领导力

1. 项目概述&#xff1a;十五载技术沉淀的启示"简申&#xff1a;十五载春秋&#xff0c;深耕不辍"这个标题背后&#xff0c;是一位技术从业者长达十五年的坚持与积累。在快速迭代的互联网行业&#xff0c;能够持续专注一个领域十五年&#xff0c;本身就是一种难能可贵…

作者头像 李华
网站建设 2026/9/13 7:58:03

JESD22-B112C标准解析:IC封装翘曲测量与优化

1. JESD22-B112C标准概述JESD22-B112C是由JEDEC固态技术协会制定的表面贴装集成电路(IC)在高温环境下封装翘曲测量的行业标准测试方法。该标准主要针对电子封装行业在回流焊工艺中出现的封装变形问题&#xff0c;提供了一套标准化的测量流程和评估体系。在表面贴装技术(SMT)工艺…

作者头像 李华
网站建设 2026/9/13 7:56:42

Kioxia BG7固态硬盘解析:OEM原厂盘的优势与实测

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/13 7:54:49

金融数据处理中的前导零问题与解决方案

1. 数据处理中的前导零陷阱&#xff1a;为什么股票代码必须作为字符串读取在金融数据处理领域&#xff0c;A股股票代码的处理看似简单却暗藏玄机。许多新手在处理CSV或Excel格式的财务数据时&#xff0c;经常会遇到一个典型问题&#xff1a;以"600519"&#xff08;贵…

作者头像 李华