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

news2025/2/26 14:20:36

刷题小记:

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

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;
    }
}

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

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

相关文章

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

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

联想 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.【…

多智能体框架

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

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…

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

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

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

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

单片机的串口(USART)

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

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

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

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

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

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

物理意义&#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…

Bugku CTF CRYPTO

Bugku CTF CRYPTO 文章目录 Bugku CTF CRYPTO聪明的小羊ok[-<>]散乱的密文.!? 聪明的小羊 描 述: 一只小羊翻过了2个栅栏 fa{fe13f590lg6d46d0d0} 分 析&#xff1a;栅栏密码&#xff0c;分2栏&#xff0c;一个栏里有11个 ①手动解密 f a { f e 1 3 f 5 9 0 l g 6 d 4 …

【洛谷】【ARC100E】Or Plus Max(高维前缀和)

传送门&#xff1a;Or Plus Max 高维前缀和 题目描述 長さ 2N の整数列 A0​, A1​, ..., A2N−1​ があります。&#xff08;添字が 0 から始まることに注意&#xff09; 1 ≤ K ≤ 2N−1 を満たすすべての整数 K について、次の問題を解いてください。 i,j を整数と…

SmolLM2:多阶段训练策略优化和高质量数据集,小型语言模型同样可以实现卓越的性能表现

SmolLM2 采用创新的四阶段训练策略&#xff0c;在仅使用 1.7B 参数的情况下&#xff0c;成功挑战了大型语言模型的性能边界&#xff1a; 在 MMLU-Pro 等测试中超越 Qwen2.5-1.5B 近 6 个百分点数学推理能力&#xff08;GSM8K、MATH&#xff09;优于 Llama3.2-1B在代码生成和文…