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

news2025/1/16 3:47:44

想要精通算法和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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1057751.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Docker中将静态页面部署nginx

1.启动nginx docker start nginx 2.进入nginx cd /usr/share/nginx/html 3.vim index.html 说明&#xff1a;没有vim命令&#xff0c;docker镜像只保留了基本的功能&#xff08;文件&#xff09;。 4.解决方法 数据卷&#xff1a;是一个虚拟目录&#xff0c;是容器内目录与…

山西电力市场日前价格预测【2023-10-04】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-10-04&#xff09;山西电力市场全天平均日前电价为311.79元/MWh。其中&#xff0c;最高日前电价为427.05元/MWh&#xff0c;预计出现在18: 45。最低日前电价为249.76元/MWh&#xff0c;预计…

Linux apt-get update - Could not connect to XXX(Connection refused)

Linux: apt-get update ----Err:Could not connect to XXX(Connection refused) - 知乎 先换源&#xff08;vi不好使用&#xff0c;可以换成gedit&#xff09; 若还是不行&#xff0c;可以再尝试执行&#xff1a; unset http_proxy unset https_proxy

决策树C4.5算法的技术深度剖析、实战解读

目录 一、简介决策树&#xff08;Decision Tree&#xff09;例子&#xff1a; 信息熵&#xff08;Information Entropy&#xff09;与信息增益&#xff08;Information Gain&#xff09;例子&#xff1a; 信息增益比&#xff08;Gain Ratio&#xff09;例子&#xff1a; 二、算…

【好玩的开源项目】Docker部署cook菜谱工具

【好玩的开源项目】Docker部署cook菜谱工具 一、cook菜谱工具介绍二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍 三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本 四、下载cook镜像五、部署cook菜谱工具5.1 创建cook容器5.2 查看容器状态5.3 检查容器日志 六、…

C/S架构学习之TCP的三次握手和四次挥手

TCP的三次握手&#xff1a;一定由客户端主动发起的&#xff0c;发生在建立连接的过程中。此过程发生在客户端的connect()函数和服务器的accept()函数之间。第一次握手&#xff1a;客户端向服务器发送一个带有SYN标志的数据包&#xff0c;表示客户端请求建立连接。并且客户端会选…

码多多ChatAI智能聊天系统-PHP源码版V2.5.0+开源端 安装教程

码多多ChatAI智能聊天系统PHP源码版&#xff0c;基于前后端分离架构以及Vue3、uni-app、ThinkPHP6.x、PHP8.0技术栈开发&#xff0c;包含PC端、H5端、小程序端、APP端。 该系统播播资源测试安装了针对环境要求高&#xff0c;PHP8.0MYSQL5.7。根目录下check文件加密文件&#x…

Ae 效果:CC Ripple Pulse

扭曲/CC Ripple Pulse Distort/CC Ripple Pulse CC Ripple Pulse &#xff08;CC 波纹脉冲&#xff09;主要用于创建动态的波纹脉冲效果&#xff0c;适用于需要动态涟漪或水波效果的场景。 效果将被限制在图层大小范围。 ◆ ◆ ◆ 效果属性说明 Center 中心 用于设置波纹脉冲…

Spring源码篇(十一)注册bean的方式

文章目录 前言bean注册的方式class扫描beanComponentScanImportDeferredImportSelectorImportBeanDefinitionRegistrar xml注册beanspring扩展点总结 前言 本篇主要以注册bean的方式从源码角度展开分析总结。 bean注册的方式 首先&#xff0c;由spring管理的对象&#xff0c…

数学建模三大类模型适用场景及建模方法(纯干货)(3)

目录 一&#xff0c;评价类算法 1&#xff0c;层次分析法 ●基本思想: ●基本步骤: ●优点: ●缺点 ●适用范围: ●改进方法: 2&#xff0c;灰色综合评价法&#xff08;灰色关联度分析&#xff09; ●基本思想: ●基本步骤: ●优点: ●缺点: ●适用范围: ●改进方…

海外媒体发稿:商务视频推广销售利器之完全指南

在当今数字化时代&#xff0c;商务视频推广已经成为了企业获取市场份额和提升销售业绩的重要手段。视频作为一种视听媒体&#xff0c;拥有更强大的感染力和传达信息的能力&#xff0c;因此在各种销售场景中得到了广泛应用。本文为大家提供了一份完全指南&#xff0c;帮助你了解…

为什么炒股人更爱融资?融券交易背后的风险与获利机会

炒股过程中&#xff0c;融资和融券交易是常见的操作方式。然而&#xff0c;据观察&#xff0c;炒股的人更倾向于选择融资交易&#xff0c;而融券交易相对较少。那么&#xff0c;是什么导致了这种偏好呢&#xff1f;本文将解析融资和融券交易的运作机制&#xff0c;以及投资者为…

【Linux】TCP的服务端 + 客户端

文章目录 &#x1f4d6; 前言1. 服务端基本结构1.1 类成员变量&#xff1a;1.2 头文件1.3 初始化&#xff1a;1.3 - 1 全双工与半双工1.3 - 2 inet_aton1.3 - 3 listen 2. 服务端运行接口2.1 accept&#xff1a;2.2 服务接口&#xff1a; 3. 客户端3.1 connect&#xff1a;3.2 …

RSIC-V工具链介绍及其安装教程

前言 &#xff08;1&#xff09;此系列文章是跟着汪辰老师的RISC-V课程所记录的学习笔记。 &#xff08;2&#xff09;该课程相关代码gitee链接&#xff1b; &#xff08;3&#xff09;PLCT实验室实习生长期招聘&#xff1a;招聘信息链接 &#xff08;4&#xff09;在配置RSIC-…

私有云OpenStack保姆级教学

一、Openstack介绍 OpenStack是由美国国家航空航天局(NASA)与Rackspace公司合作研发并发起的&#xff0c;以Apache许可证授权的自由软件和开放源代码的云计算技术解决方案&#xff0c;其是一个项目也是一个软件&#xff0c;主要用于实现云项目&#xff0c;因云项目操作系统而存…

“把握拐点,洞悉投资者情绪与比特币价格的未来之路!“

“本来这篇文章是昨天晚上发的&#xff0c;国庆节庆祝喝多了&#xff0c;心有余而力不足&#xff01;直接头躺马桶GG了” 标准普尔 500 指数 200 天移动平均线云是我几个月来一直分享的下行目标&#xff0c;上周正式重新测试了该目标。200 日移动平均线云表示为: 200 天指数移…

iMazing 2.17.10官方中文版含2023最新激活许可证码

iMazing 2.17.10官方中文版是一款iOS设备管理软件&#xff0c;该软件支持对基于iOS系统的设备进行数据传输与备份&#xff0c;用户可以将包括&#xff1a;照片、音乐、铃声、视频、电子书及通讯录等在内的众多信息在Windows/Mac电脑中传输/备份/管理。 iMazing 2.17.10官方中文…

JavaSE | 初识Java(八) | 类和对象

在 java 中定义类时需要用到 class 关键字 &#xff0c;具体语法如下 // 创建类 class ClassName{field; // 字段(属性) 或者 成员变量method; // 行为 或者 成员方法 } class 为 定义类的关键字&#xff0c; ClassName 为类的名字&#xff0c; {} 中为类的主体。 类中包含的内…

笔试强训Day11

T1&#xff1a;二叉树 链接&#xff1a;二叉树_牛客题霸_牛客网 (nowcoder.com)​​​​​​​s 题意&#xff1a;给你一颗二叉树&#xff0c;求俩个点的最近公共祖先&#xff08;LCA&#xff09; 因为比较特殊&#xff0c;树是一颗二叉树&#xff0c;二叉树的编号很特殊&…