leetcode 96. 不同的二叉搜索树

2023.8.10

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

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

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

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

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

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

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

具体代码如下:

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];
    }
};

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

相关推荐
石山代码7 分钟前
C++ 内存分区 堆区
java·开发语言·c++
心中有国也有家11 分钟前
cann-recipes-infer:昇腾 NPU 推理的“菜谱集合”
经验分享·笔记·学习·算法
绝知此事21 分钟前
【算法突围 01】线性结构与哈希表:后端开发的收纳术
java·数据结构·算法·面试·jdk·散列表
碧海银沙音频科技研究院28 分钟前
通话AEC与语音识别AEC的软硬回采链路
深度学习·算法·语音识别
csdn_aspnet1 小时前
Python 算法快闪 LeetCode 编号 70 - 爬楼梯
python·算法·leetcode·职场和发展
LuminousCPP2 小时前
数据结构 - 线性表第四篇:C 语言通讯录优化升级全记录(踩坑 + 思考)
c语言·开发语言·数据结构·经验分享·笔记·学习
张小姐的猫2 小时前
【Linux】多线程 —— 线程互斥
linux·运维·服务器·c++
AI算法沐枫2 小时前
深度学习python代码处理科研测序数据
数据结构·人工智能·python·深度学习·决策树·机器学习·线性回归
一只机电自动化菜鸟3 小时前
一建机电备考笔记(40) 建筑机电施工—排水管道施工(含考频+题型)
经验分享·笔记·学习·职场和发展·课程设计