首页 > 其他分享 >代码随想录——动态规划9不同的二叉搜索树

代码随想录——动态规划9不同的二叉搜索树

时间:2024-12-28 10:19:52浏览次数:5  
标签:int 元素 随想录 二叉 搜索 节点 dp

image

解题思路

本题通过递归 和 二叉搜索树特性解决。

当n=1时,结果是1。如果n>1时,因为根节点值不同对应的二叉搜索树肯定不同,所以我们考虑根为i(2≤i≤n)的情况。
由二叉搜索树特性,根左边一定有i-1个元素,右边一定有n-i个元素。
设f(i)函数返回i个不同元素节点组成的二叉搜索树的个数。所以可得方程:
image

为减少递归调用带来的开销,用记忆化搜索的方式优化(动态规划的一种)。设dp数组而非f(i)函数。

代码如下

class Solution {
public:
    int numTrees(int n) {
        vector<int> dp(n+1);//dp[i]是i个不同元素节点组成的二叉搜索树的个数
        dp[0] = 1;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=i;j++){
                dp[i] += dp[j-1] * dp[i-j];
            }
        }
        return dp[n];
    }
};

标签:int,元素,随想录,二叉,搜索,节点,dp
From: https://www.cnblogs.com/neromegumi/p/18637228

相关文章

  • 代码随想录算法训练营第五十九天|dijkstra(堆优化版)精讲、Bellman_ford
    前言打卡代码随想录算法训练营第49期第五十九天⚆_⚆(˘❥˘)(•̀⌓•)シ(人•͈ᴗ•͈)♡♡首先十分推荐学算法的同学可以先了解一下代码随想录,可以在B站卡哥B站账号、代码随想录官方网站代码随想录了解,卡哥清晰易懂的算法教学让我直接果断关注,也十分有缘和第49期的......
  • chrome浏览器如何设置默认的搜索引擎
    前言大家好,我是小徐啊。chrome浏览器是我们常用的浏览器,在我们开发java应用的时候,是不可或缺的。而我们开发中,经常会遇到各种各样的问题,这个时候就需要去搜索。其实,在chrome浏览器中,是可以直接在地址栏中输入关键词进行搜索的,且可以支持设置搜索引擎的,今天小徐就来介绍下。文末附......
  • 【递归,搜索与回溯算法 & floodfill 算法】深入理解 floodfill 算法:floodfill 算法小专
         图像渲染  题目解析     算法原理     解法:暴搜      模拟过程     递归过程:     回溯过程:    处理细节问题   但是如果在上述矩阵的情况下,给我们的color不是2,而是1,也就是......
  • 代码随想录——贪心23监控二叉树
    思路这道题目首先要想,如何放置,才能让摄像头最小的呢?从题目中示例,其实可以得到启发,我们发现题目示例中的摄像头都没有放在叶子节点上!这是很重要的一个线索,摄像头可以覆盖上中下三层,如果把摄像头放在叶子节点上,就浪费的一层的覆盖。所以把摄像头放在叶子节点的父节点位置,才......
  • SPAR:融合自对弈与树搜索的高性能指令优化框架
    大语言模型的指令遵循能力需要模型能够准确识别指令中的细微要求,并在输出中精确体现这些要求。现有方法通常采用偏好学习进行优化,在创建偏好对时直接从模型中采样多个独立响应。但是这种方法可能会引入与指令精确遵循无关的内容变化(例如,同一语义的不同表达方式),这干扰了模型学习识......
  • 二叉树和哈希表
    二叉树二叉树是每个节点最多有两个子树的树结构,通常子树被称作“左子树”和“右子树”。二叉树的递归定义为:二叉树或者是一棵空树,或者是一棵由一个根节点和两棵互不相交的分别称作根的左子树和右子树所组成的非空树,左子树和右子树又同样都是二叉树。下面相关代码实现都利用了......
  • 108. 将有序数组转换为二叉搜索树
    题目链接解题思路:这里面有一个构造「平衡二叉树」,似乎很难。实际上,我们每次构造时都拿中点划分,就能得到平衡的。具体来说process(nums,L,R)在nums[L,R]上构造平衡搜索二叉树,我们以中点mid=(R+L)/2是头,然后左节点process(nums,L,mid-1),右节点process(nums,mid+1,......
  • 105. 从前序与中序遍历序列构造二叉树
    题目链接解题思路:首先我们得知道人工怎么建这棵树。先序遍历[0,R1]第一个节点,就是根。然后我们在中序遍历[0,R2]找到根的位置,假如是x,那么,中序遍历中[0,x-1]就是左子树,中序遍历中[x+1,R2]就是右子树。那么先序遍历呢?左子树节点个数是x个,先序遍历是要先遍历完左子树,才能到......
  • 「数据结构课程设计」二叉排序树与文件操作
    功能要求:(1)从键盘输入一组学生记录建立二叉排序树;(2)中序遍历二叉排序树;(3)求二叉排序树深度;(4)求二叉排序树的所有节点数和叶子节点数;(5)向二叉排序树插入一条学生记录;(6)从二叉排序树中删除一条学生记录;(7)从二叉排序树中查询一条学生记录;(8)以广义表的形式输出二叉排序树该文件也......
  • 103. 二叉树的锯齿形层序遍历
    题目链接解题思路:和层序遍历有明显的不同。通过观察,可以得到,当前层,和下一层的顺序是「相反」的,遇到这种相反的问题,考虑用栈。本题就是用两个栈,一个栈在放入时,先放左儿子,再放右儿子,另一个栈在放入时,先放右儿子,再放左儿子。然后两个栈交替使用即可。为什么能得到这个思路?观察......