• 不同的二叉搜索树


    不同的二叉搜索树

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

    示例 1:
    在这里插入图片描述

    输入:n = 3
    输出:5
    示例 2:

    输入:n = 1
    输出:1

    提示:

    1 <= n <= 19

    解题思路:
    动态规划:
    以n = 3举例,
    当1为头结点的时候,其右子树有两个节点,和n为2的时候两棵树的布局一样。
    当3为头结点的时候,其左子树有两个节点,和n为2的时候两棵树的布局也是一样的。
    当2为头结点的时候,其左右子树都只有一个节点,和n为1的时候只有一棵树的布局也是一样的。
    dp[3],就是 元素1为头结点搜索树的数量 + 元素2为头结点搜索树的数量 + 元素3为头结点搜索树的数量
    元素1为头结点搜索树的数量 = 右子树有2个元素的搜索树数量 * 左子树有0个元素的搜索树数量
    元素2为头结点搜索树的数量 = 右子树有1个元素的搜索树数量 * 左子树有1个元素的搜索树数量
    元素3为头结点搜索树的数量 = 右子树有0个元素的搜索树数量 * 左子树有2个元素的搜索树数量
    有2个元素的搜索树数量就是dp[2]。
    有1个元素的搜索树数量就是dp[1]。
    所以dp[3] = dp[2] * dp[0] + dp[1] * dp[1] + dp[0] * dp[2]。
    dp[i] : 1到i为节点组成的二叉搜索树的个数为dp[i]。所以递推公式:dp[i] += dp[j - 1] * dp[i - j]; ,j-1 为j为头结点左子树节点数量,i-j 为以j为头结点右子树节点数量。

    class Solution {
        public int numTrees(int n) {
            int[] dp = new int[n + 1];
            dp[0] = 1;
            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];
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
  • 相关阅读:
    7. 使用stunnel为mysql建立加密隧道
    IMX6Q的SD卡启动使用教程(1):uboot与kernel编译移植
    区块链技术的应用场景和优势
    RK3288 android7.1显示屏幕修改
    MFC新建内部消息
    什么是push通知栏消息?
    面试:dumpsys meminfo 内存信息含义
    【C++】STL —— map和set的模拟实现
    【多线程那些事儿】多线程的执行顺序如你预期吗?
    单向的2.4G频段RF射频芯片-SI24R2E
  • 原文地址:https://blog.csdn.net/weixin_45295612/article/details/125404410