• 不同的二叉搜索树


    不同的二叉搜索树

    给你一个整数 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
  • 相关阅读:
    call函数和apply函数的区别
    OneOS基于 LVGL 移植轻量化图形组件
    图片隐写,盲水印,加密logo
    程序猿之梦 星辰大海的前端建站之路「第一周」
    20个团建游戏
    springMVC1之ModelAttribute注解
    prerender-spa-plugin报错处理,prerender-spa-plugin-next长江后浪
    《MySQL实战45讲》——学习笔记14 “count(*)的原理、与count(1)/count(id)的区别“
    你不知道的npm
    除法求值00
  • 原文地址:https://blog.csdn.net/weixin_45295612/article/details/125404410