LeetCode--95. 不同的二叉树搜索Ⅱ(动态规划)
不同的二叉树搜索Ⅱ(动态规划)
- 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. 不同的二叉树搜索Ⅱ(动态规划)相关推荐
- 【重点 递归构造二叉树】LeetCode 95. Unique Binary Search Trees II
LeetCode 95. Unique Binary Search Trees II 本博客转载自:[1]https://segmentfault.com/a/1190000007443961 [2] ...
- LeetCode实战:二叉搜索树中第K小的元素
背景 为什么你要加入一个技术团队? 如何加入 LSGO 软件技术团队? 我是如何组织"算法刻意练习活动"的? 为什么要求团队的学生们写技术Blog 题目英文 Given a bin ...
- LeetCode部分习题解答记录-动态规划
LeetCode部分习题解答记录-动态规划 动态规划 120.三角形最小路径和 方法:递归+记忆化 方法2:DP 64.最小路径和 方法1:递归 方法2:DP 从终点到起点,逐步更新 从起点到终点,逐 ...
- leetcode学习记录_二叉树_树
二叉搜索树(二叉排序树.二叉查找树) 二叉树值一种特殊的二叉树,它要么是空树,要么满足以下条件: 若左子树存在,则左子树上的所有结点都一定小于根结点,反之,右子树的所有结点都一定大于根节点,并且除了根 ...
- 算法设计——最优二叉树搜索问题
1.问题描述 假定我们正在设计一个程序,实现英语文本到法语的翻译.对英语文本中出现的每个单词,我们需要查找对应的法语单词.为了实现这些查找操作,可以创建一棵二叉搜索树,将n个英语单词作为关 ...
- leetcode 538:把二叉树搜索树转换为累加树
leetcode 538:把二叉树搜索树转换为累加树 538. 把二叉搜索树转换为累加树 给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使 ...
- Leetcode中二叉树中的搜索相关题目解析以及java实现
Leetcode中二叉树中的搜索相关题目解析以及java实现 这一类的题目其实稍微有一些杂,基本就是在二叉树中寻找一些或者某个特定值,题目比较多,我们会通过两道三篇来总结,不过总体来说也基本上就是BF ...
- LeetCode高频题:二叉树的锯齿形(Z字形,之字形)层序遍历
LeetCode高频题:二叉树的锯齿形(Z字形,之字形)层序遍历 提示:本题是系列LeetCode的150道高频题,你未来遇到的互联网大厂的笔试和面试考题,基本都是从这上面改编而来的题目 互联网大厂们 ...
- 【LeetCode】606.根据二叉树创建字符串
链接: [LeetCode]606.根据二叉树创建字符串 思路 使用二叉树的中序遍历,需要注意的是当左节点为空,右节点不为空的时候要加上(). 代码 class Solution { public:s ...
最新文章
- leetcode345——Reverse Vowels of a String(C++)
- php.ini来配置session,php.ini 配置session自动开启
- 局部图像特征描述概述
- ibatis学习笔记(三)java实体跟表映射.xml文件详解
- 如何根据事物代码查找相应BAPI
- C语言实现Graph图的算法(附完整源码)
- python 跳过计算错误_在python中计算分数时如何跳过被0除的错误?
- 比亚迪后续车都会搭在鸿蒙系统吗_华为鸿蒙系统上车,比亚迪汉发布!我告诉你华为鸿蒙到底是什么...
- datatable某一行第N列为空的时候删除某一行
- V - 不容易系列之(4)――考新郎(第二季水)
- 详解MATLAB/Simulink通信系统建模与仿真源码
- 中山纪中集训Day7+8.7模拟赛题解
- 移动开发技术——近场通信
- Linux运维常见面试题之精华收录
- JSPlumb文档翻译
- IDEA安装 激活 基本使用
- 降级论–只需要降级,就能创造更大的价值,也能获得更大的满足。
- 计算机 实验室安全准入制度,华东理工大学实验室安全准入制度
- Draemon 360开源的基于Promtheus的升级版本告警系统
- html转pdf 时插入文字,HTML转PDF字体的坑,搞了半天
热门文章
- 阿里技术专家浅谈微服务架构
- 小红书去水印代码_小红书商家须知!小红书引流靠谱吗?
- 非线编辑软件 linux,Flowblade 2.0 发布,非线性开源Linux视频编辑器
- 基于人人网的Android开发流程介绍
- wdcp mysql数据库无法链接_MySQL数据库之阿里云服务器中centos7 解决wdcp中不能远程访问mysql服务的问题...
- niosii spi 外部_NIOS II SPI详解 如何使用SPI方式传输
- 不同用户同时并发测压_教你 7 招,迅速提高服务器并发能力!
- 用python实现朴素贝叶斯算法_朴素贝叶斯算法 python 实现
- 关于Markdown编辑器怎么写“|”等特殊符号的问题
- alt和title的区别与用法