首页 > 其他分享 >day 39 96. 不同的二叉搜索树

day 39 96. 不同的二叉搜索树

时间:2023-04-10 23:23:01浏览次数:38  
标签:结点 数量 39 节点 搜索 为头 day dp 96

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

dp[3],就是 元素1为头结点搜索树的数量 + 元素2为头结点搜索树的数量 + 元素3为头结点搜索树的数量

元素1为头结点搜索树的数量 = 右子树有2个元素的搜索树数量 * 左子树有0个元素的搜索树数量

元素2为头结点搜索树的数量 = 右子树有1个元素的搜索树数量 * 左子树有1个元素的搜索树数量

元素3为头结点搜索树的数量 = 右子树有0个元素的搜索树数量 * 左子树有2个元素的搜索树数量

有2个元素的搜索树数量就是dp[2]。

有1个元素的搜索树数量就是dp[1]。

有0个元素的搜索树数量就是dp[0]

所以dp[3] = dp[2] * dp[0] + dp[1] * dp[1] + dp[0] * dp[2]

  1. 确定dp数组(dp table)以及下标的含义

dp[i] : 1到i为节点组成的二叉搜索树的个数为dp[i]。

也可以理解是i个不同元素节点组成的二叉搜索树的个数为dp[i] ,都是一样的。

以下分析如果想不清楚,就来回想一下dp[i]的定义

  1. 确定递推公式

在上面的分析中,其实已经看出其递推关系, dp[i] += dp[以j为头结点左子树节点数量] * dp[以j为头结点右子树节点数量]

j相当于是头结点的元素,从1遍历到i为止。

所以递推公式:dp[i] += dp[j - 1] * dp[i - j]; ,j-1 为j为头结点左子树节点数量,i-j 为以j为头结点右子树节点数量

  1. dp数组如何初始化

初始化,只需要初始化dp[0]就可以了,推导的基础,都是dp[0]。

那么dp[0]应该是多少呢?

从定义上来讲,空节点也是一棵二叉树,也是一棵二叉搜索树,这是可以说得通的。

从递归公式上来讲,dp[以j为头结点左子树节点数量] * dp[以j为头结点右子树节点数量] 中以j为头结点左子树节点数量为0,也需要dp[以j为头结点左子树节点数量] = 1, 否则乘法的结果就都变成0了。

所以初始化dp[0] = 1

  1. 确定遍历顺序

首先一定是遍历节点数,从递归公式:dp[i] += dp[j - 1] * dp[i - j]可以看出,节点数为i的状态是依靠 i之前节点数的状态。

那么遍历i里面每一个数作为头结点的状态,用j来遍历。

代码如下:

for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= i; j++) {
        dp[i] += dp[j - 1] * dp[i - j];
    }
}
class Solution {
    public int numTrees(int n) {
    int[] G = new int[n + 1];
        G[0] = 1;
        G[1] = 1;
        for (int i = 2; i <= n; i++) {
            for (int j = 1; j <= i; j++) {
                G[i] += G[j - 1] * G[i - j];
            }
        }
        return G[n];
    }
}

 

标签:结点,数量,39,节点,搜索,为头,day,dp,96
From: https://www.cnblogs.com/libertylhy/p/17304703.html

相关文章

  • day04
    day04注释书写注释是一个非常好的习惯平时写代码一定要注意规范java中的注释有三种:单行注释只能注释一行文字多行注释可以注释一段文字文档注释JavaDoc/***//***┌───┐ ┌───┬───┬───┬───┐┌───┬───┬───┬───┐┌......
  • Flask快速入门day 06 (sqlalchemy的使用,scoped-session线程安全)
    目录Flask框架之sqlalchemy的使用一、SQLAlchemy基本使用1、简介2、操作原生sql3、表创建4、ORM操作4、1.基本使用4、2.增删改查4、3.高级查询二、外键关系1、一对多1、1.表模型1、2.新增和基于对象的查询2、多对多2、1.表模型2、2.新增和基于对象查询3、连表查询三、scoped_sessi......
  • flask----day06()
    简历如何写--------------------------------------------------------#讲完后,用3---5天时间,把简历写好,发我看一下,就可以开始投了#你写简历的目的:只是为了有个面试机会#第一步:找一个简历模板---》导出成pdf也可以使用md写https://m.job592.com/doc/ -下载,在模板的......
  • day 1
       有公鸡X,母鸡Y,小鸡Z,知道鸡的价格,计算每种鸡的单价,x=5,y=3,z=1/3,确定每种鸡的数量范围,i>=0&&i<=20,j>=0&&j<=33,k>=0&&k<=300,根据百只鸡百钱可以进行枚举。#include<iostream>usingnamespacestd;intmain(){for(inti=0;i<=20;i++){for(intj=0......
  • leecode-day6
    1.152乘积最大连续子数组题目描述:给你一个整数数组nums ,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。测试用例的答案是一个 32-位整数。子数组是数组的连续子序列。152乘积最大连续子数组思路:这道题跟day5的连续......
  • 学习笔记394—Windows 10 MySQL 数据库安装
    Windows10MySQL数据库安装1、MySQL的安装方式MySQL的社区版(MySQLCommunity)是免费的、开源的,像企业版这些是收费的,学习阶段使用社区版的即可。MySQL社区版在Windows10的安装方式可以分为两种,一种是使用安装程序安装,另一种是使用压缩包安装。个人倾向于使用压缩包......
  • day06-SpringCloud Ribbon
    SpringCloudRibbon1.Ribbon介绍1.1Ribbon是什么?官网地址:Netflix/ribbon:Ribbon(github.com)SpringCloudRibbon是基于NetflixRibbon实现的一套客户端负载均衡的工具Ribbon主要功能是提供客户端负载均衡算法和服务调用Ribbon客户端组件提供一系列完整的配置项如连......
  • 3500/34 125696-01 捕获每个公交车站的GPS位置
    3500/34125696-01捕获每个公交车站的GPS位置因此,要设计特定的路线,必须为每个路线方向创建两条路线及其相应的公交车站。路线被设计成有向图,其中节点被用来表示汽车站,边被用来表示一个汽车站和另一个汽车站之间的距离。该模块使用Googlemaps的API,并对其进行扩展,以定义城市中特......
  • 'T' must be a non-abstract type with a public parameterless constructor
    虽然工作10多年,但是真正使用框架的项目很少很少...所以对接口,方法等约束毫无经验今天做了个动态代理dispatchproxy的类,但是在调用时却一直提示如下错误: ErrorCS0310'T'mustbeanon-abstracttypewithapublicparameterlessconstructorinordertouseitas......
  • flask-day6——sqlalchemy快速插入数据、scoped_session线程安全、sqlalchemy基本增删
    目录一、sqlalchemy快速插入数据二、scoped_session线程安全2.1基本使用2.2加在类上的装饰器三、基本增删查改3.1基本增删查改和高级查询3.2原生sql3.3django中执行原生sql四、一对多4.1表模型4.2新增和基于对象的查询五、多对多5.1表模型5.2增加和基于对象的跨表查询六......