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

代码随想录第二十天|二叉树part08--669.修建二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树

刷题小记:

上期学习了二叉搜索树的插入和删除操作,这次学习如何按区间修剪二叉搜索树。还有两题,关于借助二叉搜索树的有序特性进行转换。

669.修剪二叉搜索树(669.修剪二叉搜索树)

题目分析:

给定一个二叉搜索树的根节点root,以及最小边界low和最大边界high,通过修建二叉搜索树,使得所有节点的值在[low, high]之中。并保证不改变保留在树中元素的相对结构。

解题思路:

在450.删除二叉搜索树中的节点一题中,我们已经研究了二叉搜索树节点的删除方式,在此题之中,我们同样也面临节点删除的情况,结合情景进一步分析如下:

  • 小于下边界的节点,其左子树必然全部出界,均需剪枝;
  • 大于上边界的节点,其右子树必然全部出界,均需剪枝。

只需反复运用这两条法制,并遍历整棵树,能够确保结果正确。

解题步骤:

考虑使用前序遍历的递归解决:

  • 递归的参数:当前节点,下界,上界
  • 递归的返回值:修剪后的当前节点所在子树的根节点
  • 递归的终止条件:遇到空节点,返回null
  • 递归的单层递归逻辑:
    • 对于当前节点cur,如果cur.val<low,那么递归cur的右子树的修剪结果并直接返回
    • 对于当前节点cur,如果cur.val>high,那么递归cur的左孩子的修剪结果并直接返回
    • 递归修剪cur的左孩子
    • 递归修剪cur的右孩子
    • 返回修剪完毕的cur
class Solution {public TreeNode trimBST(TreeNode root, int low, int high) {if (root == null) return null;if (root.val < low) return trimBST(root.right, low, high);// 相当于将包含该节点在内的左半部分全部剪枝,用其右子树的修剪结果直接替代该节点if (root.val > high) return trimBST(root.left, low, high);// 相当于将包含该节点在内的右半部分全部剪枝,用其左子树的修剪结果直接替代该节点root.left = trimBST(root.left, low, high);// 修剪该节点左子树root.right = trimBST(root.right, low, high);// 修剪该节点右子树return root;}
}

108.将有序数组转换为二叉搜索树(108.将有序数组转换为二叉搜索树)

题目分析:

给定一个升序排列的整数数组nums,需将其转换成一棵平衡二叉搜索树(左右子树相差高度不超过1)。

解题重点:

构造方式:

观察题目示例发现,构造方式存在左倾式和右倾式两种。

左倾式:以大者为父节点,小者为左孩子节点。

右倾式:以小者为父节点,大者为右孩子节点。

此处我默认选择左倾式进行构造。

转换方式:

观察完构造方式,再来观察如何进行转换。

给定nums数组(包括过程中的子数组),要么长度为奇,要么为偶。

  • 若为奇数组,则中间值为当前子树的根节点,以中间值(下标为n/2)为界的左子数组转换成左子树,右子数组转换成右子树
  • 若为偶数组,由于先前采用了左倾式的构造方式(与奇数组情况统一),此处选择以下标为n/2处为中间值(数组长为n),则中间值为当前子树的根节点,以中间值为界的左子数组转换成左子树,右子数组转换成右子树

解题步骤:

构造前序遍历的递归函数traversal如下:

  • 递归的参数:转换数组nums,左边界下标left,右边界下标right(左闭右闭)
  • 递归的返回值:转换后所得子树的根节点root
  • 递归的终止条件:left > right时,返回空节点null
  • 递归的单层递归逻辑:
    • 取mid = (right + left + 1) / 2,用下标为mid的值构造当前子树的根节点root
    • 用new_left = left,new_right = mid - 1的区间构造左子树
    • 用new_left = mid + 1,new_right = rigt的区间构造右子树
    • 最终返回root。
class Solution {public TreeNode sortedArrayToBST(int[] nums) {return traversal(nums, 0, nums.length - 1);}public TreeNode traversal(int[] nums, int left, int right) {if (left > right) return null;int mid = (right + left + 1) / 2;TreeNode root = new TreeNode(nums[mid]);root.left = traversal(nums, left, mid - 1);root.right = traversal(nums, mid + 1, right);return root;}
}

538.把二叉搜索树转换为累加树(538.把二叉搜索树转换为累加树)

题目分析:

给出一棵二叉搜索树的根节点root,该树的节点值均不相同,现要求将其转换成累加树——每个节点值的新值等于原树中大于等于原值的值之和。

解题思路:

大于等于原值的值,除自身的值相等外,无其他相等的值;而大于原值的其他值,出现在该值的“右侧”,根据二叉搜索树的特性,这个“右侧”描述为:该节点的最左祖先节点x,其父节点x_dad和x_dad的右子树的全部节点。

可知,欲将二叉搜索树转换成这种累加树,应当从原树的右下方开始运算,即右中左的顺序,即倒序的中序遍历,在该遍历顺序下,每一个中节点的值更改为原节点值+前缀节点值。

解题步骤:

采用右中左的遍历顺序,构造递归函数:

  • 递归的参数:当前节点root
  • 递归的返回值:更改后的节点
  • 递归的终止条件:遇到空节点,返回null
  • 递归的单层递归逻辑:
    • 向右递归,更新累加后的“右节点”
    • 若前缀节点pre不为空,则更新当前节点值累加上前缀节点pre的值,并更新前缀节点pre
    • 向左递归,更新累加后的“左节点”
    • 返回root
class Solution {TreeNode pre = null;public TreeNode convertBST(TreeNode root) {if (root == null) return root;root.right = convertBST(root.right);if (pre != null) root.val += pre.val;pre = root;root.left = convertBST(root.left);return root;}
}

相关文章:

代码随想录第二十天|二叉树part08--669.修建二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树

刷题小记&#xff1a; 上期学习了二叉搜索树的插入和删除操作&#xff0c;这次学习如何按区间修剪二叉搜索树。还有两题&#xff0c;关于借助二叉搜索树的有序特性进行转换。 669.修剪二叉搜索树&#xff08;669.修剪二叉搜索树&#xff09; 题目分析&#xff1a; 给定一个…...

RoCEv2 高性能传输协议与 Lossless 无损网络

目录 文章目录 目录RoCERoCEv2 v.s. IBRoCEv2 协议栈RoCEv2 需要 Lossless NetworkLossless Network 拥塞控制技术网络拥塞的原因PFC 基于优先级的流量控制PFC Unfairness &#xff08;带宽分配不公平&#xff09;的问题PFC HOL&#xff08;队头拥塞&#xff09;的问题PFC Dead…...

C语言多人聊天室 ---chat(客户端聊天)

head.h #ifndef __HEAD_H #define __HEAD_H// 常用头文件 #include <stdio.h> #include <stdlib.h> #include <string.h>// 网络编程涉及的头文件 #include <sys/socket.h> #include <netinet/in.h> #include <netinet/ip.h>#include <…...

联想 SR590 服务器 530-8i RAID 控制器更换损坏的硬盘

坏了的硬盘会自动亮黄灯。用一个空的新盘来替换&#xff0c;新盘最好不要有东西。但是有东西可能也没啥&#xff0c;因为我看 RAID 控制器里有格式化的选项 1. 从 IPMI 把服务器关机&#xff0c;电源键进入绿色闪烁状态 2. 断电&#xff0c;推开塑料滑块拉出支架&#xff0c;…...

城电科技|会追日的智能花,光伏太阳花开启绿色能源新篇章

当艺术与科技相遇&#xff0c;会碰撞出怎样的火花&#xff1f;城电科技推出的光伏太阳花&#xff0c;以其独特的设计与智能化的功能&#xff0c;给出了答案。这款产品不仅具备太阳能发电的实用功能&#xff0c;更是一件充满科技属性的艺术性光伏产品&#xff0c;吸引了广泛关注…...

基于YOLO11深度学习的苹果叶片病害检测识别系统【python源码+Pyqt5界面+数据集+训练代码】

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…...

FFmpeg 命令行全解析:高效音视频处理从入门到精通

FFmpeg FFmpeg 是一款开源的多媒体处理工具集,支持音视频编解码、格式转换、流媒体处理等全链路操作。核心功能与工具: 多媒体全链路支持 支持 1000+ 音视频编解码格式(如 H.264、HEVC、AV1)和协议(RTMP、RTSP、HLS),覆盖录制、转码、流化等全流程。提供三大核心工具: …...

kafka数据拉取和发送

文章目录 一、原生 KafkaConsumer1、pom文件引入kafka2、拉取数据3、发送数据二、在spring boot中使用@KafkaListener1、添加依赖2、application.yml3、消息拉取:consumer4、自定义ListenerContainerFactory5、消息发送:producer6、kafka通过clientId鉴权时的鉴权失败问题一、…...

多智能体框架

多个不同的角色的Agent&#xff0c;共同完成一份复杂的工作。由一个统筹管理的智能体&#xff0c;自主规划多个智能体分别做什么&#xff0c;以及执行的顺序。 agent 应该包含的属性 执行特定任务 根据其角色和目标做出决策 能够使用工具来实现目标 与其他代理沟通和协作 保留…...

C++ 正则表达式分组捕获入门指南

在 C 中&#xff0c;正则表达式&#xff08;regex&#xff09;是一种用于匹配字符串模式的强大工具。正则表达式不仅能帮助你查找符合特定模式的字符&#xff0c;还能捕获匹配的子字符串&#xff08;即分组捕获&#xff09;。这篇文章将介绍 C 正则表达式中的分组捕获机制&…...

C#中级教程(1)——解锁 C# 编程的调试与错误处理秘籍

一、认识错误&#xff1a;编程路上的 “绊脚石” 在 C# 编程中&#xff0c;错误大致可分为两类&#xff1a;语法错误和语义错误&#xff08;逻辑错误&#xff09;。语法错误就像是写作文时的错别字和病句&#xff0c;编译器一眼就能识别出来&#xff0c;比如变量名拼写错误、符…...

Jmeter接口并发测试

Apache JMeter 是一款开源的性能测试工具&#xff0c;广泛用于接口并发测试、负载测试和压力测试。以下是使用 JMeter 进行接口并发测试的详细步骤&#xff1a; 一、准备工作 安装 JMeter 下载地址&#xff1a;Apache JMeter 官网 确保已安装 Java 环境&#xff08;JMeter 依…...

MySQL-增删改查

一、Create(创建) &#x1f4d6; 语法&#xff1a; INSERT INTO table_name(value_list); 当我们使用表的时候&#xff0c;就可以使用这个语法来向表中插入元素~ 我们这边创建一个用于示范的表(Student)~ create table student( id int, name varchar(20), chinese int, math…...

开源堡垒机 JumpServer 社区版实战教程:发布机的配置与Website资产配置使用

文章目录 开源堡垒机 JumpServer 社区版实战教程&#xff1a;发布机的配置与Website资产配置使用一、功能简述二、应用发布机2.1 版本要求2.2 创建应用发布机2.2.1 通过WinRM的协议进行应用发布机的创建2.2.2 通过OpenSSH的协议进行应用发布机的创建2.2.2.1 下载OpenSSH2.2.2.2…...

【STM32】使用电打火器测试火焰传感器,去掉传感器LED依然亮

项目需求&#xff1a;火焰传感器识别到火焰后&#xff0c;LED灯闪烁&#xff0c;然后熄灭。 现象描述&#xff1a;不需要火焰传感器&#xff0c;当使用电打火器时电路板LED灯也会闪烁。&#xff08;详情看底部视频&#xff09; fire.h #ifndef __FIRE_H #define __FIRE_H …...

代码随想录算法训练day64---图论系列8《拓扑排序dijkstra(朴素版)》

代码随想录算法训练 —day64 文章目录 代码随想录算法训练前言一、53. 117. 软件构建—拓扑排序二、47. 参加科学大会---dijkstra&#xff08;朴素版&#xff09;总结 前言 今天是算法营的第64天&#xff0c;希望自己能够坚持下来&#xff01; 今天继续图论part&#xff01;今…...

机器学习数学基础:32.斯皮尔曼等级相关

斯皮尔曼等级相关教程 一、定义与原理 斯皮尔曼等级相关系数&#xff08;Spearman’s rank - correlation coefficient&#xff09;&#xff0c;常用 ρ \rho ρ表示&#xff0c;是一种非参数统计量&#xff0c;用于衡量两个变量的等级之间的关联程度。它基于变量的秩次&…...

《论区块链技术及应用》审题技巧 - 系统架构设计师

区块链技术及应用论题写作框架 一、考点概述 本论题“区块链技术及应用”主要考察软件测试工程师对区块链技术的理解及其在软件项目中的实际应用能力。论题涵盖了多个关键方面&#xff0c;首先要求考生对区块链技术有全面的认识&#xff0c;包括但不限于其作为分布式记账技术…...

2024-2025 学年广东省职业院校技能大赛 “信息安全管理与评估”赛项 技能测试试卷(四)

2024-2025 学年广东省职业院校技能大赛 “信息安全管理与评估”赛项 技能测试试卷&#xff08;四&#xff09; 第一部分&#xff1a;网络平台搭建与设备安全防护任务书第二部分&#xff1a;网络安全事件响应、数字取证调查、应用程序安全任务书任务 1&#xff1a;应急响应&…...

单片机的串口(USART)

Tx - 数据的发送引脚&#xff0c;Rx - 数据的接受引脚。 串口的数据帧格式 空闲状态高电平&#xff0c;起始位低电平&#xff0c;数据位有8位校验位&#xff0c;9位校验位&#xff0c;停止位是高电平保持一位或者半位&#xff0c;又或者两位的状态。 8位无校验位传输一个字节…...

Modelfile配置说明

参数说明翻译 参数描述值类型示例用法mirostat启用Mirostat采样以控制困惑度。&#xff08;默认&#xff1a;0&#xff0c;0禁用&#xff0c;1Mirostat&#xff0c;2Mirostat 2.0&#xff09;intmirostat 0mirostat_eta影响算法对生成文本反馈的响应速度。较低的学习率将导致调…...

pnpm的基本用法

以下是 pnpm 的核心命令和使用指南&#xff0c;涵盖从安装依赖到项目管理的常见操作&#xff1a; 1. 基础命令 (1) 安装依赖 pnpm install # 安装 package.json 中的所有依赖 pnpm install <包名> # 安装指定包&#xff08;自动添加到 dependencies&#xf…...

动态规划(背包问题)--是否逆序使用的问题--二进制拆分的问题

动态规划&#xff08;背包问题&#xff09; 题目链接01背包代码 完全背包问题代码 多重背包问题 I代码 什么时候适用逆序多重背包问题 II&#xff08;超百万级的复杂度&#xff09;代码 关于二进制拆分 题目链接 01背包 代码 #include <iostream> #include <vector&…...

Vue 中动态实现进度条

在 Vue 中动态实现进度条&#xff0c;基本上有两种常见的方法&#xff1a;直接通过 Vue 数据绑定控制样式&#xff0c;或者利用外部库来实现更复杂的功能。我们会深入探讨这两种方式&#xff0c;并且详细说明每种方法的实现步骤、优缺点以及使用场景。 1. 使用 Vue 数据绑定来…...

如何基于PyTorch做二次开发

基于PyTorch进行二次开发以实现可视化工程&#xff0c;可以从以下几个方面入手&#xff1a;模型结构可视化、训练过程监控、特征可视化等。以下是一些推荐的GitHub项目&#xff0c;这些项目可以帮助你快速搭建一个可视化的工程环境&#xff1a; ### 1. **PyTorch CNN Visualiz…...

Mac 版 本地部署deepseek ➕ RAGflow 知识库搭建流程分享(附问题解决方法)

安装&#xff1a; 1、首先按照此视频的流程一步一步进行安装&#xff1a;(macos版&#xff09;ragflowdeepseek 私域知识库搭建流程分享_哔哩哔哩_bilibili 2、RAGflow 官网文档指南&#xff1a;https://ragflow.io 3、RAGflow 下载地址&#xff1a;https://github.com/infi…...

算法——后缀平衡树

先回想一下之前讨论的内容。之前我们详细讨论了后缀树&#xff0c;包括它的构建、应用以及相关算法。用户可能是在了解后缀树之后&#xff0c;想要进一步探索相关的数据结构&#xff0c;或者是想比较后缀树和后缀平衡树的异同。 后缀平衡树并不是一个常见的数据结构名称&#…...

姿态矩阵/旋转矩阵/反对称阵

物理意义&#xff0c;端点矢量角速率叉乘本身向量&#xff1b; 负号是动系b看固定系i是相反的&#xff1b; 一个固定 在惯性导航解算中&#xff0c;旋转矢量的叉乘用于描述姿态矩阵的微分方程。你提到的公式中&#xff0c; ω i b b \boldsymbol{\omega}_{ib}^b \times ωibb…...

【大语言模型】【整合版】DeepSeek 模型提示词学习笔记(散装的可以看我之前的学习笔记,这里只是归纳与总结了一下思路,内容和之前发的差不多)

以下是个人笔记的正文内容: 原文在FlowUs知识库上&#xff0c;如下截图。里面内容和这里一样&#xff0c;知识排版好看一点 一、什么是 DeepSeek 1. DeepSeek 简介 DeepSeek 是一家专注于通用人工智能&#xff08;AGI&#xff09;的中国科技公司&#xff0c;主攻大模型研发与…...

ollama无法通过IP:11434访问

目录 1.介绍 2.直接在ollama的当前命令窗口中修改&#xff08;法1&#xff09; 3.更改ollama配置文件&#xff08;法2&#xff09; 3.1更新配置 3.2重启服务 1.介绍 ollama下载后默认情况下都是直接在本地的11434端口中运行&#xff0c;绑定到127.0.0.1(localhost)&#x…...