首页 > 其他分享 >[LC96] 不同的二叉搜索树 注解

[LC96] 不同的二叉搜索树 注解

时间:2023-10-18 22:44:26浏览次数:33  
标签:元素 二叉 为头 搜索 LC96 数量 注解 节点 dp

本文基于https://leetcode.cn/problems/unique-binary-search-trees/solutions/550154/96-bu-tong-de-er-cha-sou-suo-shu-dong-ta-vn6x/
个人感觉博主部分内容讲得跳跃性较强
记录如下

正文

首先是dp数组的定义, 我觉得应该直接说明的是, dp[i] 意味着有i个节点的搜索树的数量
同时dp[0]我们在本题中人为定义为1(仅限本题)

其次是图片, 请看我用颜色记号额外标记的图片
image

可以发现N个节点的二叉搜索树, 除了根节点, 剩下的节点的拓扑关系是所有N-1个节点的搜索树的拓扑关系的并集

其中, 根节点的左右子树互相之间的变化有一定联系, 那就是节点个数之和为N-1
同时又具备一定的独立性, 当左子树的拓扑为A时, 右子树可以是a, b, c...
当左子树为B时, 右子树依旧可以是a, b, c...
因此除了根节点以外的子树部分, 他们的情况应当用乘法, 左子树的对应情况乘右子树的对应情况
这里说的对应情况指的是, 需要让左右子树节点和满足N-1这个约束条件
有点像高中的等比等差数列求和的感觉了
综上我们可以写出

dp[3] = 三个节点的搜索树个数 = 元素1为头结点搜索树的数量 + 元素2为头结点搜索树的数量 + 元素3为头结点搜索树的数量

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

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

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

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

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

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

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

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

最后代码就是


#include<vector>
using namespace std;


class Solution {
public:
    int numTrees(int n) {

        vector<int> dp(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];
    }
};

标签:元素,二叉,为头,搜索,LC96,数量,注解,节点,dp
From: https://www.cnblogs.com/angai/p/17773567.html

相关文章

  • SpringBoot 注解小记
    用于入口类的注解SpringBootApplication标识该类是入口ComponentScan表示扫描入口类同级和所有子包下的Component我们也可以使用ComponentScan("Com.XXXX")自定义扫描路径用于类的注解@Component,@Service,@Repository,@Controller四个注解用于类上,后三个实质上都是Compon......
  • @Autowired注解在实现类还是接口
    @Autowired注解在实现类还是接口首先要清楚@Service是注解在实现类上的,@Service告诉Spring容器,注册一个实例化的类对象,当@Service注解在接口上,是无法对接口实例化的。@ServicepublicclassxxxImplimplementsxxxService@Autowired本质上注入的也是实现类,但是是根据接口byTy......
  • P5018 [NOIP2018 普及组] 对称二叉树
    先递归判断当前子树是不是对称二叉树,如果是就取\(\max\)然后退出,否则继续递归左儿子的左子树和右儿子的右子树、左儿子的右子树和右儿子的左子树判断。最坏情况是每次都递归到叶子,也就是每层都是\(O(n)\)。但一共只有\(O(\logn)\)层,所以时间复杂度是\(O(n\logn)\)。......
  • 【问题记录】自定义注解处理程序 AbstractProcessor,总是提示版本不匹配
    1  前言最近在看注解处理程序,自己写一个 AbstractProcessor,发现有个莫名的提示:2 解决加上支持的版本即可,唉,折腾人。......
  • Java注解​
    Java注解学习目录:注解(Annotation)概述常见的Annotation示例自定义AnnotationJDK中的元注解利用反射获取注解信息(在反射部分涉及)1、注解概述从JDK5.0开始,Java增加了对元数据(MetaData)的支持,也就是Annotation(注解)Annotation其实就是代码里的特殊标记,这些标记可以在编......
  • 6.16后序线索二叉树
    importjava.util.Scanner;publicclassMain{publicstaticinti=0;publicstaticvoidmain(String[]args){Scannersc=newScanner(System.in);Stringstr=sc.next();Treesroot=AddTrees(str);//创建前序二叉树root.zhon......
  • 144-18 中序创建线索二叉树
    同理,先序创建线索二叉树只需要将InThread中的某部分调换位置死记硬背#include<stdio.h>#include<stdlib.h>typedefstructnode{intdata;structnode*lchild,*rchild;intlefttag,righttag;}TreeNode,*Tree;voidCreateTree(Tree&T)//先序......
  • 关于 EI 的三次多项式复合的一些注解
    感谢APJifengc指导.看了xiaoziyao的复合,大概理解EI的思路了,但是似乎细节上有一些问题,在此注记.下文「复合」均指右复合.前置内容复合二次分式的内容可以参考参考文献[2].复合\(ax+b\)先考虑如何复合\(x+c\).\[\begin{aligned}\mathrm{ans}&=\sum_{i\ge0}a_i......
  • Spring源码解析——@Transactional注解的声明式事物介绍
    正文面的几个章节已经分析了spring基于@AspectJ的源码,那么接下来我们分析一下Aop的另一个重要功能,事物管理。最全面的Java面试网站事务的介绍1.数据库事物特性原子性多个数据库操作是不可分割的,只有所有的操作都执行成功,事物才能被提交;只要有一个操作执行失败,那么所有的操作......
  • IDEA_多窗口_二叉树目录
    IDEAIDEA打开两个项目File——>Open/OpenRecent——>选择项目是替换目前正打开的项目窗口-ThisWindow/保留目前已打开的项目,重新打开一个新的窗口-NewWindowIDEA文件夹分支显示多个空文件夹创建时,内无文件的目录会叠加一起,点击设置按钮、TreeAppearance......