刷题小记:

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

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.pswp.cn/bicheng/71849.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/71849.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/71849.shtml

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

相关文章

Fisher信息矩阵(Fisher Information Matrix,简称FIM)

Fisher信息矩阵简介 Fisher信息矩阵&#xff08;Fisher Information Matrix&#xff0c;简称FIM&#xff09;是统计学和信息理论中的一个重要概念&#xff0c;广泛应用于参数估计、统计推断和机器学习领域。它以统计学家罗纳德费希尔&#xff08;Ronald Fisher&#xff09;的名…

【初阶数据结构】链表的柔光之美

目录 一、为什么需要链表&#xff1f; 二、链表与数组的对比 三、链表节点定义 四、链表基本操作 1. 创建链表 2. 插入节点 头插法&#xff08;时间复杂度O(1)&#xff09; 尾插法&#xff08;时间复杂度O(n)&#xff09; 3. 删除节点 4. 遍历链表 五、进阶操作 1. 反…

《论湖仓一体架构及其应用》审题技巧 - 系统架构设计师

软考论文写作框架 一、考点概述 “湖仓一体架构及其应用”这一论题&#xff0c;主要考察了考生对现代数据管理系统中湖仓一体架构的理解、应用及问题解决能力。随着5G、大数据、人工智能、物联网等技术的快速发展&#xff0c;企业数据的管理需求正发生深刻变化。传统的数据管…

MybatisPlus-扩展功能-枚举处理器

在Mybatis里有一个叫TypeHandler的类型处理器&#xff0c;我们常见的PO当中的这些成员变量的数据类型&#xff0c;它都有对应的处理器&#xff0c;因此它就能自动实现这些Java数据类型与数据库类型的相互转换。 它里面还有一个叫EnumOrdinalTypeHandler的枚举处理器&#xff0…

北京大学第二弹《DeepSeek提示词工程和落地场景》

大家好&#xff0c;我是吾鳴。 之前给大家分享过北京大学出品的DeepSeek教程《DeepSeek与AIGC应用》&#xff0c;今天吾鳴发现北京大学又出第二版教程了&#xff0c;教程的名称叫做《DeepSeek提示词工程和落地场景》&#xff0c;在此分享给大家。文末有完整版PDF下载地址。 教程…

deepseek自动化代码生成

使用流程 效果第一步&#xff1a;注册生成各种大模型的API第二步&#xff1a;注册成功后生成API第三步&#xff1a;下载vscode在vscode中下载agent&#xff0c;这里推荐使用cline 第四步&#xff1a;安装完成后&#xff0c;设置模型信息第一步选择API provider&#xff1a; Ope…

322.零钱兑换

class Solution(object):def coinChange(self, coins, amount):""":type coins: List[int]:type amount: int:rtype: int"""n len(coins) dp [float(inf)]*(amount 1) # 初始值为正无穷大dp[0] 0 # 一定要初始化为0if amount 0:return 0 …

ARM Cortex-M处理器中的MSP和PSP

在ARM Cortex-M系列处理器中&#xff0c;MSP&#xff08;主堆栈指针&#xff09;和PSP&#xff08;进程堆栈指针&#xff09;是两种不同的堆栈指针&#xff0c;主要用于实现堆栈隔离和提升系统可靠性。以下是它们的核心区别和应用场景&#xff1a; 1. 基本定义 MSP&#xff08;…

交换机与路由器连接方式

交换机和路由器连接的三种主要方式如下&#xff1a; 一、直连连接 这是最简单直接的连接方式。通过一根网线将交换机的一个端口与路由器的一个LAN端口相连。这种连接方式适用于小型网络&#xff0c;其中交换机负责局域网内部的数据交换&#xff0c;而路由器则负责将内部网络连接…

Python代码片段-Excel导入到MongoDB

有一次遇到一个需求&#xff0c;需要把Excel的数据导入到MongoDB中&#xff0c;表面上感觉就是导入数据很简单&#xff0c;但实际操作后&#xff0c;发现是比较麻烦的一个事情&#xff0c;一般图形化的工具对于MongoDB而言&#xff0c;导入选项都是json的&#xff0c;根本没有E…

axios几种请求类型的格式

Axios 是一个基于 Promise 的 HTTP 客户端&#xff0c;广泛用于浏览器和 Node.js 中发送 HTTP 请求。它支持多种请求格式&#xff0c;包括 GET、POST、PUT、DELETE 等。也叫RESTful 目录 一、axios几种请求类型的格式 1、get请求 2、post请求 3、put请求 4、delete请求 二…

手写系列——MoE网络

参考&#xff1a; MOE原理解释及从零实现一个MOE&#xff08;专家混合模型&#xff09;_moe代码-CSDN博客 MoE环游记&#xff1a;1、从几何意义出发 - 科学空间|Scientific Spaces 深度学习之图像分类&#xff08;二十八&#xff09;-- Sparse-MLP(MoE)网络详解_sparse moe…

Linux的基础指令和环境部署,项目部署实战(下)

目录 上一篇&#xff1a;Linxu的基础指令和环境部署&#xff0c;项目部署实战&#xff08;上&#xff09;-CSDN博客 1. 搭建Java部署环境 1.1 apt apt常用命令 列出所有的软件包 更新软件包数据库 安装软件包 移除软件包 1.2 JDK 1.2.1. 更新 1.2.2. 安装openjdk&am…

【蓝桥杯】第十五届省赛大学真题组真题解析

【蓝桥杯】第十五届省赛大学真题组真题解析 一、智能停车系统 1、知识点 &#xff08;1&#xff09;flex-wrap 控制子元素的换行方式 属性值有&#xff1a; no-wrap不换行wrap伸缩容器不够则自动往下换行wrap-reverse伸缩容器不够则自动往上换行 &#xff08;2&#xff0…

flink operator v1.10对接华为云对象存储OBS

1 概述 flink operator及其flink集群&#xff0c;默认不直接支持华为云OBS&#xff0c;需要在这些java程序的插件目录放一个jar包&#xff0c;以及修改flink配置后&#xff0c;才能支持集成华为云OBS。 相关链接参考&#xff1a; https://support.huaweicloud.com/bestpracti…

免费PDF工具

Smallpdf.com - A Free Solution to all your PDF Problems Smallpdf - the platform that makes it super easy to convert and edit all your PDF files. Solving all your PDF problems in one place - and yes, free. https://smallpdf.com/#rappSmallpdf.com-解决您所有PD…

去中心化技术P2P框架

中心化网络与去中心化网络 1. 中心化网络 在传统的中心化网络中&#xff0c;所有客户端都通过一个中心服务器进行通信。这种网络拓扑结构通常是一个星型结构&#xff0c;其中服务器作为中心节点&#xff0c;每个客户端只能与服务器通信。如果客户端之间需要通信&#xff0c;必须…

muduo源码阅读:linux timefd定时器

⭐timerfd timerfd 是Linux一个定时器接口&#xff0c;它基于文件描述符工作&#xff0c;并通过该文件描述符的可读事件进行超时通知。可以方便地与select、poll和epoll等I/O多路复用机制集成&#xff0c;从而在没有处理事件时阻塞程序执行&#xff0c;实现高效的零轮询编程模…

Pinia 3.0 正式发布:全面拥抱 Vue 3 生态,升级指南与实战教程

一、重大版本更新解析 2024年2月11日&#xff0c;Vue 官方推荐的状态管理库 Pinia 迎来 3.0 正式版发布&#xff0c;本次更新标志着其全面转向 Vue 3 技术生态。以下是开发者需要重点关注的升级要点&#xff1a; 1.1 核心变更说明 特性3.0 版本要求兼容性说明Vue 支持Vue 3.…

【图像处理 --- Sobel 边缘检测的详解】

Sobel 边缘检测的详解 目录 Sobel 边缘检测的详解1. 梯度计算2. 梯度大小3. 梯度方向4. 非极大值抑制5. 双阈值处理6. 在 MATLAB 中实现 Sobel 边缘检测7.运行结果展示8.关键参数解释9.实验与验证 Sobel 边缘检测是一种经典的图像处理算法&#xff0c;用于检测图像中的边缘。它…