背景

本篇图文是LSGO软件技术团队组织的 第二期基础算法(Leetcode)刻意练习训练营 的打卡任务。本期训练营采用分类别练习的模式,即选择了五个知识点(数组、链表、字符串、树、贪心算法),每个知识点选择了 三个简单、两个中等、一个困难 等级的题目,共计三十道题,利用三十天的时间完成这组刻意练习。

本次任务的知识点:树

是一种抽象数据类型(ADT)或是实现这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合。它是由 n(n>0) 个有限节点组成的一个具有层次关系的集合。

把它叫做「树」是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。

它具有以下的特点:

  • 每个节点都只有有限个子节点或无子节点;
  • 没有父节点的节点称为根节点;
  • 每一个非根节点有且只有一个父节点;
  • 除了根节点外,每个子节点可以分为多个不相交的子树;
  • 树里面没有环路。

题目

  • 题号:95
  • 难度:中等
  • https://leetcode-cn.com/problems/unique-binary-search-trees-ii/

给定一个整数 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

实现

第一种:递归

如果将i作为根节点,那么[1, i-1]i的左子树节点,[i+1, n]为右子树节点。

问题就被拆分为两个子问题了:

  • 求左区间构成的所有二叉搜索树作为i的左子树
  • 求右区间构成的所有二叉搜索树作为i的右子树

递归终止条件:

  • 区间为空,返回null。
  • 区间的左右端点相同,即只包含一个数,返回该数构成的根结点。

以上就是利用递归求解该问题的思路。

  • 执行结果:通过
  • 执行用时:256 ms, 在所有 C# 提交中击败了 43.40% 的用户
  • 内存消耗:28.6 MB, 在所有 C# 提交中击败了 9.09% 的用户
/*** Definition for a binary tree node.* public class TreeNode {*     public int val;*     public TreeNode left;*     public TreeNode right;*     public TreeNode(int x) { val = x; }* }*/
public class Solution
{public IList<TreeNode> GenerateTrees(int n){if (n == 0){return new List<TreeNode>();}return GenerateTrees(1, n);}public List<TreeNode> GenerateTrees(int start, int end){List<TreeNode> lst = new List<TreeNode>();//此时没有数字,将 null 加入结果中if (start > end){lst.Add(null);return lst;}//只有一个数字,当前数字作为一棵树加入结果中if (start == end){TreeNode tree = new TreeNode(start);lst.Add(tree);return lst;}//尝试每个数字作为根节点for (int i = start; i <= end; i++){//得到所有可能的左子树List<TreeNode> leftTrees = GenerateTrees(start, i - 1);//得到所有可能的右子树List<TreeNode> rightTrees = GenerateTrees(i + 1, end);//左子树右子树两两组合foreach (TreeNode leftTree in leftTrees){foreach (TreeNode rightTree in rightTrees){TreeNode root = new TreeNode(i);root.left = leftTree;root.right = rightTree;//加入到最终结果中lst.Add(root);}}}return lst;}
}

Python 语言

  • 执行结果:通过
  • 执行用时:52 ms, 在所有 Python3 提交中击败了 87.67% 的用户
  • 内存消耗:15.2 MB, 在所有 Python3 提交中击败了 6.19% 的用户
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = Noneclass Solution:def generateTrees(self, n: int) -> List[TreeNode]:if n == 0:return list()return self.generate(1, n)def generate(self, start: int, end: int) -> List[TreeNode]:lst = list()if start > end:lst.append(None)return lstif start == end:tree = TreeNode(start)lst.append(tree)return lstfor i in range(start, end + 1):leftTrees = self.generate(start, i - 1)rightTrees = self.generate(i + 1, end)for leftTree in leftTrees:for rightTree in rightTrees:tree = TreeNode(i)tree.left = leftTreetree.right = rightTreelst.append(tree)return lst

往期活动

LSGO软件技术团队会定期开展提升编程技能的刻意练习活动,希望大家能够参与进来一起刻意练习,一起学习进步!

  • Python基础刻意练习活动即将开启,你参加吗?
  • Task01:变量、运算符与数据类型
  • Task02:条件与循环
  • Task03:列表与元组
  • Task04:字符串与序列
  • Task05:函数与Lambda表达式
  • Task06:字典与集合
  • Task07:文件与文件系统
  • Task08:异常处理
  • Task09:else 与 with 语句
  • Task10:类与对象
  • Task11:魔法方法
  • Task12:模块

我是 终身学习者“老马”,一个长期践行“结伴式学习”理念的 中年大叔

我崇尚分享,渴望成长,于2010年创立了“LSGO软件技术团队”,并加入了国内著名的开源组织“Datawhale”,也是“Dre@mtech”、“智能机器人研究中心”和“大数据与哲学社会科学实验室”的一员。

愿我们一起学习,一起进步,相互陪伴,共同成长。

后台回复「搜搜搜」,随机获取电子资源!
欢迎关注,请扫描二维码:

刻意练习:LeetCode实战 -- Task23. 不同的二叉搜索树 II相关推荐

  1. leetcode算法题--不同的二叉搜索树 II

    原题链接:https://leetcode-cn.com/problems/unique-binary-search-trees-ii/ 此题的思路是对所有n为根节点情况进行遍历,然后对其左右子树进行 ...

  2. leetcode算法题--不同的二叉搜索树

    原题链接:https://leetcode-cn.com/problems/unique-binary-search-trees/ 相关题目:leetcode算法题--不同的二叉搜索树 II 1.递归 ...

  3. 20200721:每日一题之不同的二叉搜索树 II(leetcode95)

    不同的二叉搜索树 II 题目 思路与算法 代码实现 复杂度分析 题目 思路与算法 很基本的思路就是递归,没太多其他想法,直接根据二叉搜索树的性质进行递归即可. 代码实现 class Solution ...

  4. Leetcode95. 不同的二叉搜索树 II(C语言)

    Leetcode95. 不同的二叉搜索树 II(C语言) 算法-分治:算法与数据结构参考 题目: 给定一个整数 n,生成所有由 1 - n 为节点所组成的二叉搜索树1.例: 输入: 3 输出: [ [ ...

  5. LeetCode 272. 最接近的二叉搜索树值 II(栈+优先队列)

    文章目录 1. 题目 2. 解题 1. 题目 给定一个不为空的二叉搜索树和一个目标值 target,请在该二叉搜索树中找到最接近目标值 target 的 k 个值. 注意: 给定的目标值 target ...

  6. LeetCode 1214. 查找两棵二叉搜索树之和(二叉树迭代器+双指针)

    文章目录 1. 题目 2. 解题 1. 题目 给出两棵二叉搜索树,请你从两棵树中各找出一个节点,使得这两个节点的值之和等于目标值 Target. 如果可以找到返回 True,否则返回 False. 示 ...

  7. LeetCode 270. 最接近的二叉搜索树值

    文章目录 1. 题目 2. 解题 2.1 暴力查找 2.2 二分查找 1. 题目 给定一个不为空的二叉搜索树和一个目标值 target,请在该二叉搜索树中找到最接近目标值 target 的数值. 注意 ...

  8. LeetCode 95. 不同的二叉搜索树 II(递归)

    1. 题目 给定一个整数 n,生成所有由 1 - n 为节点所组成的二叉搜索树. 示例: 输入: 3 输出: [[1,null,3,2],[3,2,null,1],[3,1,null,null,2], ...

  9. LeetCode 109. 有序链表转换二叉搜索树(快慢指针+递归)

    1. 题目 给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 来源:力扣(LeetC ...

最新文章

  1. 秒杀业务架构优化之路--转
  2. php运行出现Call to undefined function curl_init()解决方法
  3. python使用的一些小事儿
  4. C++11并发实战(专栏)
  5. magento如何如何找到对应html文件_Servlet如何配置xml
  6. 补习系列(19)-springboot JPA + PostGreSQL
  7. agx 安装ros opencv_(五)树莓派3开发环境搭建——5.Android手机端与robot端ROS网络通信...
  8. 变步长的梯形求积法matlab,基于MATLAB的变步长梯形数值积分法的研究与实验
  9. 你是我心中永远抹不掉的痛
  10. 比较好的JavaScript库-日常备用
  11. Eclipse的环境变量如何配置和为什么要配置环境变量?
  12. ddt数据驱动常见的用法【多测师_王sir】
  13. 区块链游戏:何为虚拟?何为现实?
  14. jsp微信二维码收款_java实现微信支付之扫码支付
  15. 返回多字段并用数组分割方式展示
  16. CMOS反相器设计与仿真
  17. 下载学习通上没有下载权限的文件
  18. Java小农养成记第八天
  19. 中级微观经济学:Chap 7 显示偏好
  20. 华为云CCE服务不同访问方式(ingress,elb)

热门文章

  1. 台式计算机刚换的显示屏怎么设置,台式机怎么样切换显示器
  2. 软件测试的准入准出是什么?标准是什么?
  3. C++语言学习(十二)——C++语言常见函数调用约定
  4. 如何用ABAP代码读取CDS view association的数据
  5. SharePoint运行状况分析器有关磁盘空间不足的警告
  6. 使用joda-time工具类 计算时间相差多少 天,小时,分钟,秒
  7. 使用memcache做web缓存
  8. Ubuntu下自动挂载Windows分区的方法
  9. 一个表对应另一个表中多个主键的查询方法(把一个表当成两个表用)
  10. 针对抓win2003系统密码的诡计