不同的二叉树搜索Ⅱ(动态规划)

  • 1. 题目描述
  • 2. 题目分析
  • 3. Python实现

1. 题目描述

难度:中等

2. 题目分析

这道题目是LeetCode96题.不同的二叉树搜索的进阶版,动态规划的思路还是不变的,但是难度提升就在于96题要求我们只需要输出组合的数目,而95题需要我们将所有的树的组合输出。

  • 动态规划
    根据96题,我们得到的动态转移方程为:

dp[i] = dp[i] + dp[i-1]*dp[1] +dp[i-2]*dp[2] + ...+dp[1]*dp[i-1]+dp[i]

其实这一题动态转移方程式没有变,我们只需要更改dp的定义即可,在96题中,我们的dp[i]是存放前i个整数的有可能的组合数目,这一题我们dp[i]是存放的是一个列表,列表存放的是所有可能的二叉搜索树的根节点。这里有几个问题需要注意:

  • 在前i个整数范围内,当根节点为1时
    此时以1为根节点的数的左子树肯定为None
  • 在前i个整数范围内,当根节点为 i 时
    此时以i为根节点的右子树肯定为None
  • 在前i个整数范围内,当根节点在1~i之间时
    以 i = 6 为例,nums = [1, 2, 3, 4, 5, 6], 当以3为跟根节点是,左子树的可能组合与dp[2]移植,但是虽然右子树的组合数与dp[3]一致,但是dp[3]里是[1, 2, 3]构成的组合,并不是[4, 5, 6],所以我们还需要添加一个偏置,来使得dp[3]里面的树,变为[4, 5, 6]组合的树。

3. Python实现

代码如下:

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None# 返回修正偏差之后的树
def TreeNodeBias(n: TreeNode,bias: int) -> TreeNode:if n is None:return Noneelse:nbias = TreeNode(n.val + bias)nbias.left = TreeNodeBias(n.left, bias)nbias.right = TreeNodeBias(n.right, bias)return nbias
# 动态规划
class Solution:def generateTrees(self, n: int) -> List[TreeNode]:if(n == 0):return []"""存放树的根节点dp[i]表示前i个整数所生成的二叉搜索树的根节点"""dp = []  # 初始化dp列表for _ in range(n+1):dp.append([])dp[0].append(TreeNode(None))dp[1].append(TreeNode(1))"""i: 表示前i个整数, i <= nj: 表示前i个整数的第j个数当做根节点"""for i in range(2, n+1):for j in range(1, i+1):left_num = j-1    # dp[left_num]为左子树的组合数right_num = i-j   # dp[right_num]为右子树的组合数# 对左右子树的可能的情况进行组合for left in range(len(dp[left_num])):for right in range(len(dp[right_num])):temp = TreeNode(j)   # 根节点为jif left_num == 0:    # 如果j为1,那么左子树肯定是Nonetemp.left = Noneelse:                # 否则,依次添加左子树temp.left = dp[left_num][left]if j != i:           # 如果j == i,那么右子树肯定为None,因为是右子树,所以不用考虑添加Nonetemp.right = TreeNodeBias(dp[right_num][right], i-right_num)dp[i].append(temp)return dp[n]

运行结果为:

LeetCode--95. 不同的二叉树搜索Ⅱ(动态规划)相关推荐

  1. 【重点 递归构造二叉树】LeetCode 95. Unique Binary Search Trees II

    LeetCode 95. Unique Binary Search Trees II 本博客转载自:[1]https://segmentfault.com/a/1190000007443961 [2] ...

  2. LeetCode实战:二叉搜索树中第K小的元素

    背景 为什么你要加入一个技术团队? 如何加入 LSGO 软件技术团队? 我是如何组织"算法刻意练习活动"的? 为什么要求团队的学生们写技术Blog 题目英文 Given a bin ...

  3. LeetCode部分习题解答记录-动态规划

    LeetCode部分习题解答记录-动态规划 动态规划 120.三角形最小路径和 方法:递归+记忆化 方法2:DP 64.最小路径和 方法1:递归 方法2:DP 从终点到起点,逐步更新 从起点到终点,逐 ...

  4. leetcode学习记录_二叉树_树

    二叉搜索树(二叉排序树.二叉查找树) 二叉树值一种特殊的二叉树,它要么是空树,要么满足以下条件: 若左子树存在,则左子树上的所有结点都一定小于根结点,反之,右子树的所有结点都一定大于根节点,并且除了根 ...

  5. 算法设计——最优二叉树搜索问题

    ​​​​​​1.问题描述 假定我们正在设计一个程序,实现英语文本到法语的翻译.对英语文本中出现的每个单词,我们需要查找对应的法语单词.为了实现这些查找操作,可以创建一棵二叉搜索树,将n个英语单词作为关 ...

  6. leetcode 538:把二叉树搜索树转换为累加树

    leetcode 538:把二叉树搜索树转换为累加树 538. 把二叉搜索树转换为累加树 给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使 ...

  7. Leetcode中二叉树中的搜索相关题目解析以及java实现

    Leetcode中二叉树中的搜索相关题目解析以及java实现 这一类的题目其实稍微有一些杂,基本就是在二叉树中寻找一些或者某个特定值,题目比较多,我们会通过两道三篇来总结,不过总体来说也基本上就是BF ...

  8. LeetCode高频题:二叉树的锯齿形(Z字形,之字形)层序遍历

    LeetCode高频题:二叉树的锯齿形(Z字形,之字形)层序遍历 提示:本题是系列LeetCode的150道高频题,你未来遇到的互联网大厂的笔试和面试考题,基本都是从这上面改编而来的题目 互联网大厂们 ...

  9. 【LeetCode】606.根据二叉树创建字符串

    链接: [LeetCode]606.根据二叉树创建字符串 思路 使用二叉树的中序遍历,需要注意的是当左节点为空,右节点不为空的时候要加上(). 代码 class Solution { public:s ...

最新文章

  1. leetcode345——Reverse Vowels of a String(C++)
  2. php.ini来配置session,php.ini 配置session自动开启
  3. 局部图像特征描述概述
  4. ibatis学习笔记(三)java实体跟表映射.xml文件详解
  5. 如何根据事物代码查找相应BAPI
  6. C语言实现Graph图的算法(附完整源码)
  7. python 跳过计算错误_在python中计算分数时如何跳过被0除的错误?
  8. 比亚迪后续车都会搭在鸿蒙系统吗_华为鸿蒙系统上车,比亚迪汉发布!我告诉你华为鸿蒙到底是什么...
  9. datatable某一行第N列为空的时候删除某一行
  10. V - 不容易系列之(4)――考新郎(第二季水)
  11. 详解MATLAB/Simulink通信系统建模与仿真源码
  12. 中山纪中集训Day7+8.7模拟赛题解
  13. 移动开发技术——近场通信
  14. Linux运维常见面试题之精华收录
  15. JSPlumb文档翻译
  16. IDEA安装 激活 基本使用
  17. 降级论–只需要降级,就能创造更大的价值,也能获得更大的满足。
  18. 计算机 实验室安全准入制度,华东理工大学实验室安全准入制度
  19. Draemon 360开源的基于Promtheus的升级版本告警系统
  20. html转pdf 时插入文字,HTML转PDF字体的坑,搞了半天

热门文章

  1. 阿里技术专家浅谈微服务架构
  2. 小红书去水印代码_小红书商家须知!小红书引流靠谱吗?
  3. 非线编辑软件 linux,Flowblade 2.0 发布,非线性开源Linux视频编辑器
  4. 基于人人网的Android开发流程介绍
  5. wdcp mysql数据库无法链接_MySQL数据库之阿里云服务器中centos7 解决wdcp中不能远程访问mysql服务的问题...
  6. niosii spi 外部_NIOS II SPI详解 如何使用SPI方式传输
  7. 不同用户同时并发测压_教你 7 招,迅速提高服务器并发能力!
  8. 用python实现朴素贝叶斯算法_朴素贝叶斯算法 python 实现
  9. 关于Markdown编辑器怎么写“|”等特殊符号的问题
  10. alt和title的区别与用法