LeetCode 96. 不同的二叉搜索树

🌈🌈😄😄

欢迎来到茶色岛独家岛屿,本期将为大家揭晓LeetCode 96. 不同的二叉搜索树 ,做好准备了么,那么开始吧。

🌲🌲🐴🐴

一、题目名称

二、题目要求

三、相应举例

四、限制要求

五、解决办法

六、代码实现

方法一:动态规划

方法二:递归

一、题目名称

LeetCode 96. 不同的二叉搜索树

二、题目要求

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

三、相应举例

示例 1:

LeetCode 96. 不同的二叉搜索树
输入:n = 3
输出:5

示例 2:

输入:n = 1
输出:1

四、限制要求

  • *1 <= n <="8</code"><!--=-->

五、解决办法

动态规划

题目要求是计算不同二叉搜索树的个数。为此,我们可以定义两个函数:

G(n): 长度为 n 的序列能构成的不同二叉搜索树的个数。

F(i, n): 以 i为根、序列长度为 n 的不同二叉搜索树个数 (1≤i≤n)。

可见,G(n) 是我们求解需要的函数。

稍后我们将看到,G(n) 可以从 F(i,n) 得到,而F(i,n) 又会递归地依赖于 G(n)。

LeetCode 96. 不同的二叉搜索树

对于边界情况,当序列长度为 1(只有根)或为 0(空树)时,只有一种情况,即:
G(0)=1,G(1)=1

六、代码实现

方法一:动态规划

class Solution {
    public int numTrees(int n) {
        int[] G = new int[n + 1];
        G[0] = 1;
        G[1] = 1;

        for (int i = 2; i

外层for循环是遍历G中从2开始到n的每个节点,目的是为了求出类似于G(2),G(3)等等,若直接使用下面的循环,如下图:

LeetCode 96. 不同的二叉搜索树

刚开始会出现G(2)=0,求出G(n)=0的现象,而

使用外层循环可以依次求出G(2),G(3)等,即节点的 二叉搜索树的种数,可以防止这种情况出现。如下图:

LeetCode 96. 不同的二叉搜索树

每次循环可依次求出G(2),G(3)等 二叉搜索树的种数,直到最后求G(n)。

方法二:递归


    Map map = new HashMap<>();
    public int numTrees(int n) {

        if (n == 0 || n == 1){
            return 1;
        }
        //防止重复递归查找
        if (map.containsKey(n)){
            return map.get(n);
        }

        int count = 0;
        //当i为根节点时
        for (int i = 1; i

LeetCode 96. 不同的二叉搜索树

LeetCode 96. 不同的二叉搜索树

Original: https://blog.csdn.net/weixin_62275996/article/details/128707939
Author: 茶色岛
Title: LeetCode 96. 不同的二叉搜索树

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/815084/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球