leetcode95 Unique Binary Search Trees II

题目:

Given n, generate all structurally unique BST's (binary search trees) that store values 1...n.

For example,
Given n = 3, your program should return all 5 unique BST's shown below.

 

思路:

本题采取递归的思路。

传递的参数是开始数值(begin)和结束数值(end)。

当begin > end 时,返回空(注意不是null);

当begin == end 时, 返回含有 new TreeNode(begin)结点的ArrayList;

当begin < end时,建立两个ArrayList来分别接收左右子树。

 

代码:

复制代码
 1     public  List<TreeNode> generateTrees(int n){
 2         return generateTrees(1, n);
 3     }
 4     
 5     public List<TreeNode> generateTrees(int begin, int end){
 6         List<TreeNode> arr = new ArrayList<TreeNode>();
 7         if(begin > end){
 8             return arr;
 9         }
10         if(begin == end){
11             TreeNode ptr = new TreeNode(begin);
12             arr.add(ptr);
13             return arr;
14         }
15         for(int i = begin; i <= end; i++){
16             List<TreeNode> left = new ArrayList<TreeNode>();
17             List<TreeNode> right = new ArrayList<TreeNode>();
18             left = generateTrees(begin, i-1);
19             right = generateTrees(i+1, end);
20             //注意判断left和right是否为空
21             //还有,要注意应该在最内层循环每次都新建根结点
22             if(left.size() == 0){        
23                 if(right.size() == 0){
24                     TreeNode root = new TreeNode(i);
25                     root.left = null;
26                     root.right = null;
27                     arr.add(root);
28                 }else{
29                     for(TreeNode r: right){
30                         TreeNode ptr = new TreeNode(i);
31                         ptr.left = null;
32                         ptr.right = r;
33                         arr.add(ptr);
34                     }
35                 }
36             }else{
37                 if(right.size() == 0){
38                     for(TreeNode l: left){
39                         TreeNode ptr = new TreeNode(i);
40                         ptr.left = l;
41                         ptr.right = null;
42                         arr.add(ptr);
43                     }
44                 }else{
45                     for(TreeNode l: left){
46                         for(TreeNode r: right){
47                             TreeNode ptr = new TreeNode(i);
48                             ptr.left = l;
49                             ptr.right = r;
50                             arr.add(ptr);
51                         }
52                     }
53                 }
54             }
55         }
56         return arr;
57     }
复制代码

 

posted @   沧浪少年  阅读(909)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示