力扣算法题—096不同的二叉树【二叉树】

给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种?

示例:

输入: 3
输出: 5
解释:
给定 n = 3, 一共有 5 种不同结构的二叉搜索树:

   1         3     3      2      1
    \       /     /      / \      \
     3     2     1      1   3      2
    /     /       \                 \
   2     1         2                 3


解题思路:
  

就跟斐波那契数列一样,我们把n = 0 时赋为1,因为空树也算一种二叉搜索树,那么n = 1时的情况可以看做是其左子树个数乘以右子树的个数,左右字数都是空树,所以1乘1还是1。那么n = 2时,由于1和2都可以为跟,分别算出来,再把它们加起来即可。n = 2的情况可由下面式子算出:

dp[2] =  dp[0] * dp[1]   (1为根的情况)

    + dp[1] * dp[0]    (2为根的情况)

同理可写出 n = 3 的计算方法:

dp[3] =  dp[0] * dp[2]   (1为根的情况)

    + dp[1] * dp[1]    (2为根的情况)

      + dp[2] * dp[0]    (3为根的情况)

 

 1 class Solution {
 2 public:
 3     int numTrees(int n) {
 4         vector<int> dp(n + 1, 0);
 5         dp[0] = 1;
 6         dp[1] = 1;
 7         for (int i = 2; i <= n; ++i) {
 8             for (int j = 0; j < i; ++j) {
 9                 dp[i] += dp[j] * dp[i - j - 1];
10             }
11         }
12         return dp[n];
13     }
14 };

 

转载于:https://www.cnblogs.com/zzw1024/p/10817076.html

### 如何系统有效地练习LeetCode算法题目 #### 选择合适的起点 对于初学者来说,可以从简单的题目入手,逐步提升难度。LeetCode提供了不同难度级别的分类,可以根据个人水平选择适合自己的起始点。 #### 制定学习计划 制定合理的学习计划非常重要。可以按照主题来划分学习模块,比如先掌握数组操作、字符串处理等基础知识,再深入到动态规划、图论等领域。每天设定固定的时间用于解题训练,并保持持续性[^1]。 #### 掌握基础数据结构算法 熟悉常用的数据结构(如栈、队列、链表、哈希表)以及基本算法(排序、查找),这些是解决复杂问题的基础工具。通过不断实践加深理解,在遇到新问题时能够灵活运用已有知识构建解决方案。 #### 多角度思考同一问题 尝试从多个视角分析同一个问题,寻找不同的求解路径。例如针对二叉树的最大深度计算,既可以通过递归方式实现自底向上的遍历,也可以采用层次遍历的方法完成相同功能[^2]。 #### 总结归纳常见模式 随着做题数量增加,会发现许多看似各异的问题其实遵循着相似的设计思路或技巧应用。及时总结这类规律有助于提高解决问题效率并增强举一反三的能力。 #### 参加竞赛和讨论社区 积极参在线编程比赛能有效检验自己实力的同时还能接触到更多优秀选手的作品;加入技术交流群组则可以获得来自他人的宝贵建议和支持。 ```cpp // 计算整数的汉明重量示例代码 class Solution { public: int hammingWeight(uint32_t n) { string binaryString; while (n > 0) { binaryString += to_string(n % 2); n /= 2; } reverse(binaryString.begin(), binaryString.end()); int countOfOnes = 0; for (char digit : binaryString) { if (digit == '1') ++countOfOnes; } return countOfOnes; } }; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值