数据结构——二叉树——二叉搜索树(Binary Search Tree, BST)

目录

一、98. 验证二叉搜索树

 二、96. 不同的二叉搜索树

 三、538. 把二叉搜索树转换为累加树


  • 二叉搜索树:对于二叉搜索树中的每个结点,其左子结点的值小于该结点的值,而右子结点的值大于该结点的值

一、98. 验证二叉搜索树

给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。

有效 二叉搜索树定义如下:

  • 节点的左

    子树

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

示例 1:

输入:root = [2,1,3]
输出:true

示例 2:

输入:root = [5,1,4,null,null,3,6]
输出:false
解释:根节点的值是 5 ,但是右子节点的值是 4 。

提示:

  • 树中节点数目范围在[1, 104] 内
  • -231 <= Node.val <= 231 - 1

 

分析:

class Solution {public boolean isValidBST(TreeNode root) {return isBST(root, Long.MIN_VALUE, Long.MAX_VALUE); // 初始时,上下界分别为长整型的最小值和最大值}public boolean isBST(TreeNode root, long min, long max) {if (root == null) {return true; // 空节点符合二叉搜索树的定义}if (root.val <= min || root.val >= max) {return false; // 如果当前节点的值不在允许的范围内,则不是二叉搜索树}// 递归检查左子树和右子树,并更新上下界return isBST(root.left, min, root.val) && isBST(root.right, root.val, max);}
}

 二、96. 不同的二叉搜索树

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

示例 1:

输入:n = 3
输出:5

示例 2:

输入:n = 1
输出:1

提示:

  • 1 <= n <= 19 

分析:

  • 动态规划
class Solution {public int numTrees(int n) {// dp[i] 表示由 i 个节点组成且节点值从 1 到 i 的二叉搜索树的数量int[] dp = new int[n + 1];// 初始条件,空树也算一种情况,所以 dp[0] = 1dp[0] = 1;// 遍历每个节点数for (int i = 1; i <= n; i++) {// 遍历以当前节点为根节点的情况for (int j = 1; j <= i; j++) {// 左子树的节点数为 j-1,右子树的节点数为 i-jdp[i] += dp[j - 1] * dp[i - j];//组合数学里的乘法原理}}return dp[n];}
}

 三、538. 把二叉搜索树转换为累加树

给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。

提醒一下,二叉搜索树满足下列约束条件:

  • 节点的左子树仅包含键 小于 节点键的节点。
  • 节点的右子树仅包含键 大于 节点键的节点。
  • 左右子树也必须是二叉搜索树。

示例 1:

输入:[4,1,6,0,2,5,7,null,null,null,3,null,null,null,8]
输出:[30,36,21,36,35,26,15,null,null,null,33,null,null,null,8]

示例 2:

输入:root = [0,null,1]
输出:[1,null,1]

示例 3:

输入:root = [1,0,2]
输出:[3,3,2]

示例 4:

输入:root = [3,2,4,1]
输出:[7,9,4,10]

提示:

  • 树中的节点数介于 0 和 104 之间。
  • 每个节点的值介于 -104 和 104 之间。
  • 树中的所有值 互不相同 。
  • 给定的树为二叉搜索树。

分析:

  • 反序中序遍历,右中左
  • 遍历过的节点都大于未遍历的节点,当前节点的新值即等于上一个遍历的节点的新值加上当前节点的旧值
class Solution {int sum = 0;public TreeNode convertBST(TreeNode root) {traverse(root);return root;}// 采用反序中序遍历,累加每个节点的值private void traverse(TreeNode root) {if (root == null) return;// 先遍历右子树traverse(root.right);// 更新当前节点的值为累加和sum += root.val;root.val = sum;// 再遍历左子树traverse(root.left);}
}

 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于单片机16路多路抢答器仿真系统设计

**单片机设计介绍&#xff0c;基于单片机16路多路抢答器仿真系统设计 文章目录 一 概要二、功能设计三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机16路多路抢答器仿真系统的设计概要主要涵盖硬件设计、软件编程以及功能实现等方面。以下是针对该设计的详细概…

RA8900CE计时芯片介绍及开发方案

计时芯片 就是一个需要连接32.768k晶振的RTC芯片 规格书阅读 首先我们先读懂这个芯片是怎么用的。 引脚表 封装是这样的&#xff0c;一共10个引脚。 基本上一看这个引脚表就知道大概。 T1和T2是工厂测试的&#xff0c;不用管。 SCL和SDA是IIC通讯用的。 FOUT和FOE就是链…

GD32F470_GP2Y0A02YK0F 红外激光测距传感器 避障测距20-150cm模块移植

2.4 红外测距传感器 GP2Y0A02YKOF是夏普的一款距离测量传感器模块。它由PSD(position sensitive detector)和IRED(infrared emitting diode)以及信号处理电路三部分组成。由于采用了三角测量方法,被测物体的材质、环境温度以及测量时间都不会影响传感器的测量精度。传感器输出电…

线段树和树状数组

实战演练 1.【模板】树状数【模板】树状数组1 输入&#xff1a; 5 5 1 5 4 2 3 2 2 4 1 2 3 2 2 3 4 1 1 5 1 2 1 4 注意&#xff1a;只修改一个数&#xff08;单点修改&#xff09;&#xff0c;却要输出一个区间的值&#xff08;区间查询&#xff09;&#xff01;&#xff…

FreeRTOS学习 -- 再识

工作中一直使用FreeRTOS进行着开发&#xff0c;但是没有进行过系统的总结过。现在将快速使用几天时间将FreeRTOS相关知识点加以总结。 官网&#xff1a; https://www.freertos.org/zh-cn-cmn-s/ 参看资料&#xff1a; 正点原子 STM32F1 FreeRTOS开发手册_V1.2.pdf The FreeRTOS…

LangChain入门:15.Sequential Chain:顺序链的使用

Sequential Chain是LangChain库中的一个强大工具&#xff0c;它允许我们将多个LLMChain按照特定的顺序连接起来&#xff0c;形成一个处理流程。这种链式结构使得我们可以将一个大任务分解为几个小任务&#xff0c;并依次执行&#xff0c;每个任务的输出成为下一个任务的输入。 …

linux:du和df区别

文章目录 1. 概述2. du 命令2. df 命令3. 区别总结 1. 概述 du 和 df 都是 Linux 系统中用于查看磁盘空间使用情况的命令&#xff0c;但它们的功能和用法有所不同。 2. du 命令 du 是 “disk usage” 的缩写&#xff0c;用于显示文件或目录的磁盘使用情况。du 命令用于查看指…

如何用matplotlib画图像的时候使用中文标签名

Matplotlib 中文显示不是特别友好&#xff0c;要在 Matplotlib 中显示中文&#xff0c;我们可以通过两个方法&#xff1a; 下载使用支持中文的字体库。设置 Matplotlib 的字体参数。 下载使用支持中文的字体库: Matplotlib 默认情况不支持中文&#xff0c;我们可以使用以下简…

Disk Drill Enterprise for Mac v5.5.1515数据恢复软件中文版

Disk Drill 是 Mac 操作系统固有的Mac数据恢复软件&#xff1a;使用 Recovery Vault 轻松保护文件免遭意外删除&#xff0c;并从 Mac 磁盘恢复丢失的数据。支持大多数存储设备&#xff0c;文件类型和文件系统。 软件下载&#xff1a;Disk Drill Enterprise for Mac v5.5.1515激…

博士推荐 | 拥有超过10年的数据解决方案经验,数据驱动的决策者

编辑 / 木子 审核 / 朝阳 伟骅英才 伟骅英才致力于以大数据、区块链、AI人工智能等前沿技术打造开放的人力资本生态&#xff0c;用科技解决职业领域问题&#xff0c;提升行业数字化服务水平&#xff0c;提供创新型的产业与人才一体化服务的人力资源解决方案和示范平台&#x…

jupyter python paramiko 网络系统运维

概述 通过使用jupyter进行网络运维的相关测试 设备为H3C 联通性测试 import paramiko import time import getpass import re import os import datetimeusername "*****" password "*****" ip "10.32.**.**"ssh_client paramiko.SSHCli…

【明道云】设置默认值时,发现单选项目无法与文本项目比较

【背景】 新建表单&#xff0c;其中字段B的默认值通过使用字段A在另一张表单B中搜索获得。 字段A在当前表的填写形式是下拉框&#xff0c;而用于比较的表单B的相应字段A1则是文本。因此在建立条件时发现由于组件类型不同&#xff0c;无法选到字段A作为比较条件。 【解决办法】…