96. 不同的二叉搜索树

给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。

示例 1:

复制代码
输入:n = 3
输出:5

示例 2:

复制代码
输入:n = 1
输出:1

提示:

  • 1 <= n <= 19
cpp 复制代码
class Solution {
public:
    int numTrees(int n) {
        //dp[i]:由i个节点组成的二叉搜索树有dp[i]种
        //推导:n=3;
        //节点为 1,2,3。 二叉搜索树,左子树小于根节点,根节点小于右子树。三种情况
        //1、头节点为1,有两种情况 1。dp[1] = 左边0节点数种类 * 右边2节点 树种类
        //2、头节点为2,只有一种情况 dp[2] = 左边1节点种类 * 右边1节点种类
        //3、头节点为3,有两种,dp[3] = 左边2节点 * 右边0节点
        //所以:dp[i] = dp[j-1] * dp[i-j]; 左边节点个数 * 右边节点个数。左边一种情况,对应右边 n 个节点种类
        
        //初始化;dp[0] = 1;空二叉搜索树也算一个
        int dp[20] = {0}; //因为需要需要 n个情况累加,所以得赋值
        dp[0] = 1;
        //需要枚举 以每一个小于 n的节点作为头节点的情况
        //要求n=4,需要得出右边为3个节点时的种类,即dp[3];
//当3为头结点的时候,其左子树有两个节点,看这两个节点的布局,是不是和n为2的时候两棵树的布局也是一样的啊!
//当2为头结点的时候,其左右子树都只有一个节点,布局是不是和n为1的时候只有一棵树的布局也是一样的啊!
//发现到这里,其实我们就找到了重叠子问题了,其实也就是发现可以通过dp[1] 和 dp[2] 来推导出来dp[3]的某种方式。
        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];
    }
};
相关推荐
Demon--hx7 小时前
jsoncpp 核心概念梳理:命名空间、Value 容器与格式化输出
c++
徐小夕15 小时前
花了3个月,我们做了一款 AI 版的“飞书文档”
前端·算法·github
Robert--cao15 小时前
移动底盘与机械臂联合规划:开源算法与工程实现
算法
小豆庄16 小时前
Mac 上给视频人脸打码:本地工具的依赖、追踪与推理管线
算法·视觉检测·视频·敏捷流程·纹理贴图
星夜离尘5616 小时前
MATLAB 工程实验:从相邻块均值手写重叠 Allan 偏差,数清有效项
算法·matlab·均值算法
y1su18 小时前
Leetcode 字符串模板
java·数据结构·算法·leetcode·职场和发展·动态规划
residual_fan19 小时前
船用柴油机动态机动工况故障诊断:控制感知仿射网络(CAAN)的技术实现
人工智能·算法·数据挖掘·数据分析
syagain_zsx19 小时前
BRpc 二次封装:Channel 管理、服务管理与回调工厂
c++·学习·程序人生·rpc·谷歌
其实防守也摸鱼19 小时前
Cylab在线靶场——CTF中的通用技能
linux·数据库·学习·算法·靶场·ctf·学习网络安全
蓝悦无人机20 小时前
《Planning algorithms》读书笔记——第8章 反馈运动规划
算法·读书笔记·反馈运动规划