当前位置: 首页 > news >正文

想要精通算法和SQL的成长之路 - 验证二叉搜索树和不同的二叉搜索树

想要精通算法和SQL的成长之路 - 验证二叉搜索树和不同的二叉搜索树

  • 前言
  • 一. 验证二叉搜索树
  • 二. 不同的二叉搜索树
  • 三. 不同的二叉搜索树II

前言

想要精通算法和SQL的成长之路 - 系列导航

二叉搜索树的定义:

  • 节点的左子树只包含 小于 当前节点的数。
  • 节点的右子树只包含 大于 当前节点的数。
  • 所有左子树和右子树自身必须也是二叉搜索树。

一. 验证二叉搜索树

原题链接
在这里插入图片描述
思路:

  1. 树的中序遍历:左节点 --> 父节点 --> 右节点。
  2. 我们按照中序遍历二叉树,比较节点的大小即可。可以用一个全局的临时变量来存储上一个节点的值。

代码如下:

long preVal = Long.MIN_VALUE;public boolean isValidBST(TreeNode root) {if (root == null) {return true;}// 判断左节点if (!isValidBST(root.left)) {return false;}// 当前节点肯定是要大于上一个节点的值的,这样才满足二叉搜索树的性质if (root.val <= preVal) {return false;}// 更新pre值preVal = root.val;// 判断右节点return isValidBST(root.right);
}

二. 不同的二叉搜索树

原题链接
在这里插入图片描述
思路如下:

  1. 我们假设dp[i] 是以 i 个数字组合而成的不同二叉搜索树的个数。
  2. f(i) :代表以数字 i 为根节点的二叉搜索树个数。
  3. 那么此时,左节点的节点数量为: i - 1,右节点的节点数量为: n - i 。那么左侧节点可组成的不同二叉树个数为:dp[i-1],右侧为:dp[n-i]
  4. f(i) = dp[i-1] * dp[n-i]
  5. dp[n] = f(1) + f(2) + ... + f(n) = dp[0] * dp[n-1] + dp[1] * dp[n-2] + ... + dp[n-1] + dp[0]。即得一个动态规划的递推公式。

最终代码如下:

public int numTrees(int n) {int[] dp = new int[n + 1];// 初始化dp[0] = 1;dp[1] = 1;for (int i = 2; i < n + 1; i++) {for (int j = 1; j < i + 1; j++) {dp[i] += dp[j - 1] * dp[i - j];}}return dp[n];
}

三. 不同的二叉搜索树II

原题链接
在这里插入图片描述

我们可以用自底向上的一种思路去考虑,当以数字 i 作为根节点,构建二叉搜索树的时候,数量有多少?

  1. 我们假设一个函数:buildTree(int left , int right) 是用来统计区间[left,right]范围内,不同的二叉搜索树集合。
  • 那么当以数字 i 作为根节点的时候,左侧区间可拿到的集合为:buildTree(left, i -1 ),右侧为:buildTree(i+1,right)
  • 拿到这两个左右集合之后,我们遍历他们,两两结合,以数字 i 作为根节点,构建二叉搜索树。

不难得出代码:

public List<TreeNode> buildTree(int left, int right) {ArrayList<TreeNode> res = new ArrayList<>();// 边界判断if (left > right) {res.add(null);return res;}if (left == right) {res.add(new TreeNode(left));return res;}// 统计区间[left,right]内的二叉搜索树个数for (int i = left; i <= right; i++) {// 如果以 i 作为二叉搜索树的根节点,那么,左侧区间可构建的二叉搜索树的数量为List<TreeNode> leftBSTNum = buildTree(left, i - 1);List<TreeNode> rightBSTNum = buildTree(i + 1, right);// 左右两个子二叉搜索树两两结合for (TreeNode leftTree : leftBSTNum) {for (TreeNode rightTree : rightBSTNum) {TreeNode root = new TreeNode(i);root.left = leftTree;root.right = rightTree;res.add(root);}}}return res;
}

那么最终代码如下:

public List<TreeNode> generateTrees(int n) {ArrayList<TreeNode> res = new ArrayList<>();// 特殊值判断if (n == 0) {return res;}return buildTree(1, n);
}public List<TreeNode> buildTree(int left, int right) {ArrayList<TreeNode> res = new ArrayList<>();// 边界判断if (left > right) {res.add(null);return res;}if (left == right) {res.add(new TreeNode(left));return res;}// 统计区间[left,right]内的二叉搜索树个数for (int i = left; i <= right; i++) {// 如果以 i 作为二叉搜索树的根节点,那么,左侧区间可构建的二叉搜索树的数量为List<TreeNode> leftBSTNum = buildTree(left, i - 1);List<TreeNode> rightBSTNum = buildTree(i + 1, right);// 左右两个子二叉搜索树两两结合for (TreeNode leftTree : leftBSTNum) {for (TreeNode rightTree : rightBSTNum) {TreeNode root = new TreeNode(i);root.left = leftTree;root.right = rightTree;res.add(root);}}}return res;
}

相关文章:

想要精通算法和SQL的成长之路 - 验证二叉搜索树和不同的二叉搜索树

想要精通算法和SQL的成长之路 - 验证二叉搜索树和不同的二叉搜索树 前言一. 验证二叉搜索树二. 不同的二叉搜索树三. 不同的二叉搜索树II 前言 想要精通算法和SQL的成长之路 - 系列导航 二叉搜索树的定义&#xff1a; 节点的左子树只包含 小于 当前节点的数。节点的右子树只包…...

SpringCloudAlibaba 相关组件的学习一

目录 前言 系统架构演变 1、单体架构 2、垂直架构 3、分布式架构 4、SOA架构 5、微服务架构 一、微服务架构的介绍 1、微服务架构的常见问题 2 微服务架构的常见概念 2.1 服务治理 2.2 服务调用 2.3 服务网关 2.4 服务容错 2.5 链路追踪 3、微服务架构的常用解决…...

【C语言 模拟实现strncpy函数、strncat函数、strncmp函数、strstr函数】

C语言程序设计笔记---026 C语言之模拟实现strncpy函数、strncat函数、strncmp函数、strstr函数1、介绍strncpy函数1.1、模拟实现strncpy函数 2、介绍strncat函数2.1、模拟实现strncat函数 3、介绍strncmp函数3.1、模拟实现strncmp函数 4、介绍strstr函数4.1、模拟实现strstr函数…...

Mongodb7启动报错排除解决方案

一&#xff1a; 报错信息: [rootwww log]# journalctl -xe -- Unit mongodb.service has begun starting up. /usr/local/mongodb/mongdb7/bin/mongod --help for more information 10月 03 13:47:39 www.yhchange.com systemd[1]: mongodb.service: control process exited, …...

王杰国庆作业day5

...

QT、C++实现地图导航系统(mapSystem)

文章目录 地图导航系统项目应用背景技术栈选择数据处理算法实现界面实现源码展示成果展示源码下载 &#xff08;免费&#xff09; 地图导航系统 项目应用背景 电子地图导航系统的主要目的是为用户提供精确、实时的导航和位置信息&#xff0c;以帮助他们在城市或地区内轻松找到…...

STM32 定时器介绍--通用、高级定时器

目录 高级定时器 1.功能框图 1-时钟源 2-时基单元 3-输入捕获 4-输出比较 2.输入捕获的应用 3.输出比较的应用 4.初始化结构体 1-时基初始化结构体 2-输出比较结构体 3-PWM信号 周期和占空比的计算--以通用定时器为例 4-输入捕获结构体 5-断路和死区初始化结构体…...

淘宝天猫渠道会员购是什么意思?如何开通天猫淘宝渠道会员购有什么用?

淘宝天猫渠道会员购是什么意思&#xff1f; 淘宝天猫渠道会员购与淘宝天猫粉丝福利购意思基本相同&#xff0c;都可以领取淘宝天猫大额内部隐藏优惠券、通过草柴APP开通绑定渠道会员还可以获得购物返利。 草柴APP如何绑定开通淘宝天猫渠道会员&#xff1f; 1、手机下载安装「…...

(Note)机器学习面试题

机器学习 1.两位同事从上海出发前往深圳出差&#xff0c;他们在不同时间出发&#xff0c;搭乘的交通工具也不同&#xff0c;能准确描述两者“上海到深圳”距离差别的是&#xff1a; A.欧式距离 B.余弦距离 C.曼哈顿距离 D.切比雪夫距离 S:D 1. 欧几里得距离 计算公式&#x…...

思科:iOS和iOSXe软件存在漏洞

思科警告说,有人试图利用iOS软件和iOSXe软件中的一个安全缺陷,这些缺陷可能会让一个经过认证的远程攻击者在受影响的系统上实现远程代码执行。 中严重程度的脆弱性被追踪为 CVE-2023-20109 ,并以6.6分得分。它会影响启用Gdoi或G-Ikev2协议的软件的所有版本。 国际知名白帽黑客…...

CCF CSP认证 历年题目自练Day19

题目一 试题编号&#xff1a; 201812-1 试题名称&#xff1a; 小明上学 时间限制&#xff1a; 1.0s 内存限制&#xff1a; 512.0MB 问题描述&#xff1a; 题目背景   小明是汉东省政法大学附属中学的一名学生&#xff0c;他每天都要骑自行车往返于家和学校。为了能尽可能充…...

Java 开发环境配置

在本章节中我们将为大家介绍如何搭建Java开发环境。 目录 window系统安装java 下载JDK 配置环境变量 JAVA_HOME 设置 PATH设置 CLASSPATH 设置 测试JDK是否安装成功 Linux&#xff0c;UNIX&#xff0c;Solaris&#xff0c;FreeBSD环境变量设置 流行 Java 开发工具 使…...

[2023.09.26]: JsValue的转换体验与as关键字的浅析

昨天解决了焦点问题&#xff0c;今天就开始搬砖了。本以为可以一帆风顺&#xff0c;但是还是遇到了几个问题&#xff0c;不过还好&#xff0c;都被一一解决&#xff0c;这里我分享一下JsValue的转换体验以及关键字as的使用浅析。 场景描述 我是在什么情况下遇到JsValue的转换…...

SpringBoot Validation入参校验国际化

在 Spring Boot 中&#xff0c;可以使用 Validation 和国际化来实现对入参的校验。 常用的校验 NotNull验证字段值不能为 nullNotEmpty验证字段值不能为 null 或空字符串NotBlank验证字符串字段值不能为空、null&#xff0c;并且必须至少包含一个非空白字符Size验证字符串、…...

树莓集团涉足直播产业园区运营,成都直播产业园区再添黑马

树莓集团涉足成都直播产业园运营领域&#xff0c;这一消息引起了业界的广泛关注。在这个无限可能的直播领域中&#xff0c;树莓集团将与上市公司德商产投紧密合作&#xff0c;立志为成都直播行业的发展注入新的活力。成都天府蜂巢直播产业园推行着一系列创新的政策措施&#xf…...

中小学教师ChatGPT的23种用法

原文&#xff1a;中小学教师ChatGPT的23种用法 近日&#xff0c;ChatGPT引发舆论风暴&#xff0c;火遍全球。作为一款生成式人工智能软件&#xff0c;ChatGPT可以就任何议题生成文本&#xff0c;完成包括回答问题&#xff0c;撰写文章、论文、诗歌在内的多种工作。各界盛赞其“…...

Ubuntu性能分析-ftrace 底层驱动

1、框架介绍 ftrace内核驱动可以分为几部分:ftrace framework,RingBuffer,debugfs,Tracepoint,各种Tracer。 ftrace框架是整个ftrace功能的纽带,包括对内和的修改,Tracer的注册,RingBuffer的控制等等。 RingBuffer是静态动态ftrace的载体。 debugfs则提供了用户空间…...

网盘搜索引擎:点亮知识星空,畅享数字宝藏!

大家好&#xff01;作为一名资深的网络产品运营人员&#xff0c;我今天要向大家介绍一款让你受益匪浅的神奇工具——网盘搜索引擎&#xff01;它可以帮助你免费搜索查询各种云盘共享资源&#xff0c;包括影视作品、纪录片、小说、动漫等等。现在&#xff0c;我们急需网络流量&a…...

Mysql以key-val存储、正常存储的区别

场景 你作为一个服务端工程师&#xff0c;假设产品要求设计这么一个页面&#xff0c;页面上包含很多模块&#xff0c;每个模块都可以单独进行变更&#xff0c;有些模块是富文本。 实现方式有很多&#xff0c;我们来聊比较常用的两种&#xff0c;看看mysql的表如何设计。 第一…...

MySQL 索引优化实践(单表)

目录 一、前言二、表数据准备三、常见业务无索引查询耗时测试3.1、通过订单ID / 订单编号 查询指定订单3.2、查询订单列表 四、订单常见业务索引优化实践4.1、通过唯一索引和普通索引优化通过订单编号查询订单信息4.2、通过普通联合索引优化订单列表查询4.2.1、分析查询字段的查…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

【Java学习笔记】Arrays类

Arrays 类 1. 导入包&#xff1a;import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序&#xff08;自然排序和定制排序&#xff09;Arrays.binarySearch()通过二分搜索法进行查找&#xff08;前提&#xff1a;数组是…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

随着新能源汽车的快速普及&#xff0c;充电桩作为核心配套设施&#xff0c;其安全性与可靠性备受关注。然而&#xff0c;在高温、高负荷运行环境下&#xff0c;充电桩的散热问题与消防安全隐患日益凸显&#xff0c;成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展&#xff0c;光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域&#xff0c;IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选&#xff0c;但在长期运行中&#xff0c;例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换

目录 关键点 技术实现1 技术实现2 摘要&#xff1a; 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式&#xff08;自动驾驶、人工驾驶、远程驾驶、主动安全&#xff09;&#xff0c;并通过实时消息推送更新车…...

PHP 8.5 即将发布:管道操作符、强力调试

前不久&#xff0c;PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5&#xff01;作为 PHP 语言的又一次重要迭代&#xff0c;PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是&#xff0c;借助强大的本地开发环境 ServBay&am…...

Oracle11g安装包

Oracle 11g安装包 适用于windows系统&#xff0c;64位 下载路径 oracle 11g 安装包...

Leetcode33( 搜索旋转排序数组)

题目表述 整数数组 nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转&#xff0c;使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...