第95题:不同的二叉搜素树II
2024-08-27 01:27:49
一. 问题描述
给定一个整数 n,生成所有由 1 ... n 为节点所组成的二叉搜索树。
示例:
输入: 3
输出:
[
[1,null,3,2],
[3,2,null,1],
[3,1,null,null,2],
[2,1,3],
[1,null,2,null,3]
]
解释:
以上的输出对应以下 5 种不同结构的二叉搜索树:
1 3 3 2 1
\ / / / \ \
3 2 1 1 3 2
/ / \ \
2 1 2 3
二. 解题思路
本题思路:采用递归+深度搜索的方式进行构建二叉搜索树。
步骤一:运用for循环依次将1-n当成根节点i进行搜索。
步骤二:当构建左子树时,递归函数(frist 到i-1),构建右子树时,递归函数(i+1到end)。
步骤三:当在递归函数的最底部时,需要将每一层节点子树的可能性添加到list列表中,并返回给上一层。
步骤四:最终遍历结束,返回最终list表。
三. 执行结果
执行用时 :2 ms, 在所有 java 提交中击败了99.49%的用户
内存消耗 :37.1 MB, 在所有 java 提交中击败了90.28%的用户
四. Java代码
class Solution {
public List<TreeNode> generateTrees(int n) {
if(n==0)
{
List<TreeNode> result=new ArrayList<TreeNode>();
return result;
} List<TreeNode> result=new ArrayList<TreeNode>();
result=Tree(1,n);
return result;
}
public List<TreeNode> Tree(int first,int end) {
List<TreeNode> list=new ArrayList<TreeNode>();
if(first>end) list.add(null);
for(int i=first;i<=end;i++)
{
List<TreeNode> left=Tree(first,i-1);
List<TreeNode> right=Tree(i+1, end);
for(int m=0;m<left.size();m++ )
{
for(int n=0;n<right.size();n++)
{
TreeNode newroot=new TreeNode(i);
newroot.left=left.get(m);
newroot.right=right.get(n);
list.add(newroot);
}
} }
return list;
}
}
最新文章
- 我收录整理的优秀OC技术类文章
- 用JS做的时钟
- Java构建工具Ant小记(一)
- (spring-第5回【IoC基础篇】)spring容器从加载配置文件到实例化bean的内部工作机制
- JavaScript高级程序设计40.pdf
- ubuntu texlive 中文的配置方法
- php 常用代码段
- ReentrantReadWriteLock读写锁的使用1
- 014_zk路径过滤分析
- linux 学习笔记六 tail 命令
- Django中提供的6种缓存方式
- UBANTU zongjie
- NOIp模拟赛 现实(DP 拓扑)
- 接口文档管理系统mindoc安装手册
- sourcetree 添加私钥
- PAT 1046 划拳(15)(代码)
- C# 泛型的简单理解(安全、集合、方法、约束、继承)
- nginx fastcgi.conf的参数
- HTML5、CSS3与响应式Web设计入门(2)
- 从CM刷机过程和原理分析Android系统结构