leetcode 96. 不同的二叉搜索树

2023.8.10

本题可以先在草稿上画出各种不同的二叉搜索树,从中寻找规律,找出递推关系:

例如:当n=3时,分三种情况:

①1作为根节点,此时左子树有0个节点,右子树有2两个节点,此时的二叉树种数应该有dp0*dp2种。

②2作为根节点,此时左右子树各有一个节点,种数都是dp1,此时的二叉树种数应该有dp1*dp1种。

③3作为根节点,此时情况和第一种情况类似,只是左右子树交换了。

于是可以分析得出:dpi 需要从1到 i 进行 i 次累加,每次累加的内容为:dp左子树的节点个数 * dp右子树的节点个数。 代码的步骤如下:

  • 定义dp数组,大小为n。 须明确dpi 的含义:代表由i个节点组成的二叉搜索树的种数。
  • 初始化dp数组,当i=0 或者i=1时,此时二叉搜索树的种数都为1。
  • 用两层for循环对dpi进行更新。

具体代码如下:

cpp 复制代码
class Solution {
public:
    int numTrees(int n) {
        vector<int> dp(n+1); //dp[i]代表:由i个节点组成的二叉搜索树的种数。
        dp[0] = 1;
        dp[1] = 1;
        for(int i=2; i<=n; i++)
        {
            for(int j=1; j<=i; j++)
            {
                dp[i] += dp[j-1] * dp[i-j]; //左子树有j-1个节点,右子树有i-j个节点。
            }
        }
        return dp[n];
    }
};

很不错的题目,日后二刷。

相关推荐
shehuiyuelaiyuehao9 小时前
算法31,前缀和,可被k整除的子数组
数据结构·python·算法
测试199810 小时前
如何用appium搭建Android自动化测试框架?
自动化测试·软件测试·python·测试工具·职场和发展·appium·测试用例
203号居民11 小时前
LeetCode hot 100 — 141. 环形链表2
算法·leetcode·链表
玖玥拾11 小时前
LeetCode 202 快乐数
算法·leetcode
LuminousCPP11 小时前
数据结构-二叉树(六):BFS层序遍历与完全二叉树判断|复用链式队列 + (N_0=N_2+1) 性质证明
c语言·数据结构·笔记·算法·二叉树·宽度优先
ZhouDevin12 小时前
算法论文/数据集3——CLD(TMLR2025)压缩训练集,仅保留对验证集有益的样本
人工智能·深度学习·算法·计算机视觉
码匠许师傅12 小时前
【设计模式精讲】14.外观模式(Facade)
c++·设计模式·uml·外观模式
Tim_1013 小时前
【LeetCode】29、两数相除
算法·leetcode·职场和发展
纪念 22913 小时前
数据结构排序(三)
数据结构
船厂电气自动化ai大模型13 小时前
AI大模型与数学/第63课:矩阵定义、矩阵加法、标量乘法(逐级精讲)
数据结构·人工智能·深度学习·线性代数·算法