代码随想录day21 二叉树最后一天 || 669修剪二叉树 108将有序数组转变为平衡搜索二叉树 538把搜索二叉树变为累加二叉树

669修剪二叉树 

力扣题目链接

题目描述:

给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树,使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元素的相对结构 (即,如果没有被移除,原有的父代子代关系都应当保留)。 可以证明,存在 唯一的答案 。

所以结果应当返回修剪好的二叉搜索树的新的根节点。注意,根节点可能会根据给定的边界发生改变。

示例 1:

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

示例 2:

输入:root = [3,0,4,null,2,null,null,1], low = 1, high = 3
输出:[3,2,null,1]

代码:

 class Solution {  
public:  TreeNode* trimBST(TreeNode* root, int low, int high) {  if (root == nullptr) return nullptr;  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;  }  
};  

代码解释:
 

详细解释

  1. Base Case:

    • 如果当前节点是空 (nullptr),直接返回空,因为没有树需要修剪。
  2. 修剪逻辑:

    • 节点值小于 low
      如果当前节点值 root->val < low,这意味着当前节点和它的左子树所有节点都小于 low,需要被修剪掉。所以,我们修剪右子树。

       

      if (root->val < low) { TreeNode* rightTrimmed = trimBST(root->right, low, high); return rightTrimmed; }

      这里,对右子树调用 trimBST 递归函数,并将修剪后的右子树赋值给 rightTrimmed,然后释放当前节点,返回修剪后的右子树。

    • 节点值大于 high
      如果当前节点值 root->val > high,这意味着当前节点和它的右子树所有节点都大于 high,需要被修剪掉。所以,我们修剪左子树。

       

      if (root->val > high) { TreeNode* leftTrimmed = trimBST(root->left, low, high); return leftTrimmed; }

      这里,对左子树调用 trimBST 函数,并将修剪后的左子树赋值给 leftTrimmed,然后释放当前节点,返回修剪后的左子树。

    • 节点值在区间 [low, high] 之间:
      如果当前节点的值在 [low, high] 之间,那么当前节点是需要保留的节点。但是仍然需要继续修剪其左右子树。

       

      root->left = trimBST(root->left, low, high); root->right = trimBST(root->right, low, high); return root;

      这里,通过递归处理左右子树,并将返回的修剪后的子树赋值给当前节点的左右子节点,最后返回当前节点。

108将有序数组转变为平衡搜索二叉树

力扣题目链接

题目描述:

给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 

平衡

 二叉搜索树。

示例 1:

输入:nums = [-10,-3,0,5,9]
输出:[0,-3,9,-10,null,5]
解释:[0,-10,5,null,-3,null,9] 也将被视为正确答案:

示例 2:

输入:nums = [1,3]
输出:[3,1]
解释:[1,null,3] 和 [3,1] 都是高度平衡二叉搜索树。

代码:

#include <vector>  // 树节点的定义  
struct TreeNode {  int val;               // 节点的值  TreeNode *left;        // 左子节点  TreeNode *right;       // 右子节点  TreeNode() : val(0), left(nullptr), right(nullptr) {}     // 无参构造函数  TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} // 有参构造函数  TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} // 完整构造函数  
};  class Solution {  
public:  // 递归构造 BST 的辅助函数  TreeNode* travesal(std::vector<int>& nums, int left, int right) {  // 基准条件:如果左索引超过右索引,返回空指针  if(left > right) return nullptr;  // 计算中间索引,避免整数溢出的安全写法  int mid = left + (right - left) / 2;  // 创建根节点,值为数组中间位置的值  TreeNode* root = new TreeNode(nums[mid]);  // 递归构造左子树,范围为[left, mid-1]  root->left = travesal(nums, left, mid - 1);  // 递归构造右子树,范围为[mid + 1, right]  root->right = travesal(nums, mid + 1, right);  // 返回根节点  return root;  }  // 主函数,将有序数组转换为 BST  TreeNode* sortedArrayToBST(std::vector<int>& nums) {  // 初始调用辅助函数,范围为整个数组  int left = 0;  int right = nums.size() - 1;  // 获取并返回构造出的 BST 的根节点  TreeNode* root = travesal(nums, left, right);  return root;  }  
};  

详细解释

  1. TreeNode 结构体
    定义了树节点,其中 val 是节点的值,left 和 right 分别是左子节点和右子节点。无参构造函数将节点默认初始化为值 0 和空子节点,有参构造函数将节点的值初始化为给定值,最后一个构造函数同时初始化节点的值和子节点。

  2. travesal 函数(递归辅助函数)
    这个函数递归地构建 BST:

    • 基准条件:当 left 超过 right 时,返回空指针,表示该子树为空。
    • 中间索引:计算中间索引 mid,它是子数组的中间元素的位置。
    • 创建根节点:使用中间元素创建根节点。
    • 分别递归构建左子树和右子树:递归调用 travesal 函数,分别构建左子树(范围为 left 到 mid-1)和右子树(范围为 mid+1 到 right)。
    • 返回根节点:返回该子树的根节点。
  3. sortedArrayToBST 函数(主函数)
    这是主函数,调用递归辅助函数来构建 BST:

    • 初始化 left 和 right 索引,分别为数组的起始和结束位置。
    • 调用 travesal 函数来构建 BST,并得到根节点。
    • 返回最终构建好的根节点。

举个例子:

假设输入的有序数组是 [1, 2, 3, 4, 5, 6, 7],我们将通过该方法将其转换为高度平衡的 BST。

  1. 取数组的中间元素 4 作为根节点。
  2. 将左半部分 [1, 2, 3] 递归构建左子树:
    • 子数组 [1, 2, 3] 的中间元素 2 作为左子树的根节点。
    • 子数组 [1] 递归构建左子树:1 作为左子树的根节点。
    • 子数组 [3] 递归构建右子树:3 作为右子树的根节点。
  3. 将右半部分 [5, 6, 7] 递归构建右子树:
    • 子数组 [5, 6, 7] 的中间元素 6 作为右子树的根节点。
    • 子数组 [5] 递归构建左子树:5 作为左子树的根节点。
    • 子数组 [7] 递归构建右子树:7 作为右子树的根节点。

 

538把搜索二叉树变为累加二叉树

力扣题目链接

题目描述:

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

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

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

注意:本题和 1038: . - 力扣(LeetCode) 相同

示例 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]

代码:

class Solution {
public:int pre=0;TreeNode* convert(TreeNode* cur){if(cur==NULL)return NULL;convert(cur->right);cur->val+=pre;pre=cur->val;convert(cur->left);return cur;}TreeNode* convertBST(TreeNode* root) {return convert(root);}
};

这题需要注意的是遍历顺序,逆中序遍历,其他的没什么很简单

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

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

相关文章

K8s 核心组件——API Server

1. Kubernetes API Server 概述 1.1 基本概念 Kubernetes API Server&#xff08;API Server&#xff09;是 Kubernetes 的核心组件之一&#xff0c;负责暴露 Kubernetes API 给用户和客户端&#xff0c;接收和处理来自客户端的请求&#xff0c;并将其存储到 etcd 中。Kubern…

花几千上万学习Java,真没必要!(三十一)

集合&#xff1a; 1、数组的特性&#xff1a; 2、ArrayList&#xff08;动态数组&#xff09;&#xff1a; 测试代码1&#xff1a; package listtest.com; import java.util.ArrayList; import java.util.List; public class HashCodesArrayList { public static void ma…

.NET MAUI:跨平台开发的未来

常用资源 &#xff08;1&#xff09;.NET MAUI8构建应用文档。 Build your first .NET MAUI app - .NET MAUI | Microsoft Learn 一、什么是 .NET MAUI&#xff1f; .NET Multi-platform App UI (.NET MAUI) 是微软推出的一款跨平台开发框架。作为 Xamarin.Forms 的下一代产…

深入分析 Android ContentProvider (六)

文章目录 深入分析 Android ContentProvider (六)ContentProvider 的性能优化和实践案例&#xff08;续&#xff09;1. 性能优化技巧&#xff08;续&#xff09;1.6. 使用批量插入优化性能示例&#xff1a;批量插入实现 1.7. 使用 Projections 优化查询示例&#xff1a;使用 Pr…

本周热点丨快手《可灵》国际版正式上线、《王者荣耀》国际服海外下载量破5000万

7月第4周 秦彻带动《恋与深空》2.0霸榜全球 《蔚蓝档案》上线3.5周年庆典版本&#xff0c;登顶日服iOS畅销榜 《Honor of Kings》下载量突破五千万 英伟达将开发"Blackwell"的中国定制版芯片 人工智能初创公司Cohere获得5亿美元融资 Fal AI推出全新开源图像生成模型A…

reshape函数及MATLAB应用

reshape 函数在 MATLAB 中是一个非常有用的函数&#xff0c;通过重新排列现有元素来重构数组。它允许你重新调整数组&#xff08;或矩阵&#xff09;的尺寸&#xff0c;而不改变其数据。这个函数特别适用于当你需要将一个矩阵或数组从一种结构转换为另一种结构时&#xff0c;只…

Python 入门学习第三课

# 遍历列表 # 通常使用for循环 格式 for 自己定义的名字&#xff1a;列表: # 冒号不要忘记了 在这之后 需要缩进 如果不缩进 将进行一次 message [zahngsan,lisi,wangwu] for wq in message:print(wq) # 练习题 message [xiande,tiande,choude] for wq in message:print(wq) …

【GoodERP更新日志】发票管理 模块 增加 批量通知开票 功能结算单 增加 按凭证号查询、按是否生成凭证 查询 筛选

开源项目GoodERP更新-2024年7月28日 本次提交合并增加的功能或解决的问题&#xff1a; 1、结算单 增加 按凭证号查询、按是否生成凭证 查询 筛选 2、增加发票 批量通知开票 功能 3、修正发票号码为8或20位校验 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来…

AFSim 仿真系统--任务处理器入门指南

任务处理器 任务处理器&#xff08;WSF_TASK_PROCESSOR&#xff09;是一个WSF处理器&#xff0c;它提供了检查轨迹管理器中的数据&#xff08;轨迹&#xff09;并对其采取行动的能力。这些行动包括&#xff1a; *向下属分配任务 *激活或停用传感器或干扰器 *开火武器 *操纵平台…

Vue项目发布后浏览器缓存问题解决

1. 现象描述 每次Jenkins自动化发布Vue项目后&#xff0c;用户需要手动全部清理历史缓存数据才可以使用系统&#xff0c;用户体验非常不好 2. 解决方案 2.1 配置public/index.html 配置index.html, 在首页启动no-store禁止缓存 <meta http-equiv"pragram" co…

达梦数据库系列—35.DM常用SQL

目录 实例相关 用户权限 内存相关 表相关 分区表/索引 表空间 文件相关 数据文件 undo文件 Temp文件 在线日志 归档日志 备份还原 JOB相关 主备 DSC ASM 会话相关 锁相关 sql相关 执行计划 系统负载 实例相关 版本 select * from v$version; select id…

昇思MindSpore 应用学习-DCGAN生成漫画头像-CSDN

日期 心得 昇思MindSpore 应用学习-DCGAN生成漫画头像&#xff08;AI代码学习&#xff09; DCGAN生成漫画头像 在下面的教程中&#xff0c;我们将通过示例代码说明DCGAN网络如何设置网络、优化器、如何计算损失函数以及如何初始化模型权重。在本教程中&#xff0c;使用的动…

vue2和el-input无法修改和写入,并且不报错

文章目录 一. 业务场景描述二. 原因分析三.解决方案3.1 方案一 原生标签&#xff08;不建议&#xff09;3.2 方案二 父子传递&#xff08;不建议&#xff09;3.3 方案三 vuex&#xff0c;pinia 状态传值&#xff08;不建议&#xff09;3.4 方案四 vue初始化属性 &#xff08;建…

Java从入门到精通(十三)~ 枚举和注解

晚上好&#xff0c;愿这深深的夜色给你带来安宁&#xff0c;让温馨的夜晚抚平你一天的疲惫&#xff0c;美好的梦想在这个寂静的夜晚悄悄成长。 文章目录 目录 前言 一、枚举 1.1 枚举的概念 ​编辑 1.2 枚举的特点 1.3 枚举的实际运用 1. 状态机&#xff0c;描述属性的…

Nginx配置详解

1. Nginx安装 进入到/usr/local目录下&#xff0c;执行命令&#xff1a; yum install -y nginx通过如下命令启动nginx服务 systemctl start nginx通过如下命令&#xff0c;设置nginx开启自启动 systemctl enable nginxnginx默认占用80端口。 访问ip:80&#xff0c;可以看到…

Open3D 点云按xyz轴等距切片

目录 一、概述 1.1原理 1.2实现步骤 1.3应用 二、代码实现 2.1关键函数 2.2完整代码 三、实现效果 3.1原始点云 3.2按x轴切片 3.3按y轴切片 3.4按z轴切片 Open3D点云算法汇总及实战案例汇总的目录地址&#xff1a; Open3D点云算法与点云深度学习案例汇总&#xff…

Java中线程池的基本使用

参考这个课程&#xff0c;讲的非常详细 27.线程池使用步骤总结_哔哩哔哩_bilibili 应用场景 商品秒杀 文件上传 订票系统 自定义线程池&#xff08;让我们了解底层逻辑的&#xff09; 构造方法 饱和机制 就是我们的队列饱和后我们该怎么处理 是拒绝这个任务还是啥…

Aria2 任意文件写入漏洞

目录 Aria2介绍漏洞描述漏洞复现 Aria2介绍 Aria2是一个在命令行下运行&#xff0c;多协议&#xff0c;多来源下载工具&#xff08;HTTP / HTTPS&#xff0c;FTP&#xff0c;BitTorrent&#xff0c;Metalink&#xff09;&#xff0c;内建XML-RPC用户界面。Aria提供RPC服务器&a…

流媒体服务器一:使用成熟的流媒体SRS 搭建 RTMP流媒体服务器

1 安装和测试srs流媒体服务器 服务器&#xff1a;SRS(Simple RTMP Server&#xff0c;⽀持RTMP、HTTP-FLV&#xff0c;HLS) 推流端&#xff1a;ffmpeg OBS 拉流端&#xff1a;ffplay VLC srs播放器 1.1 安装srs流媒体服务器 官网 SRS (Simple Realtime Server) | SRS 码…

18746 逆序数

这个问题可以使用归并排序的思想来解决。在归并排序的过程中&#xff0c;我们可以统计逆序数的数量。当我们合并两个已经排序的数组时&#xff0c;如果左边的数组中的元素&#xfffd;&#xfffd;于右边的数组中的元素&#xff0c;那么就存在逆序&#xff0c;逆序数的数量就是…