【算法训练 day25 修剪二叉搜索树、将有序数组转化为二叉搜索树、把二叉树搜索转化为累加树】

目录

  • 一、修剪二叉搜索树-LeetCode 669
    • 思路
    • 实现代码
      • 个人代码
      • 视频链接代码
    • 个人问题
  • 二、将有序数组转化为二叉搜索树-LeetCode 108
    • 思路
    • 实现代码
    • 个人问题
  • 三.把二叉树搜索转化为累加树-LeeCode 538
    • 思路
    • 实现代码
    • 个人问题


一、修剪二叉搜索树-LeetCode 669

Leecode链接: leetcode 669
文章链接: 代码随想录
视频链接: B站

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

示例:

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

思路

这道题我跟视频链接的思路稍微有点不一样,我用的是后序遍历。优先判断左右子树的状态,如果左右子树都为空,那么该节点就是叶子节点,根据自身值是否满足区间要求返回空或者本身即可。如果不是叶子节点,那么需要对右子树着重判断,因为如果该节点值不满足[low,high]区间,不代表该节点的右子树值不满足这个区间,如果满足就返回右子树的节点,否则返回空。

实现代码

个人代码

//cpp
class Solution {
public:TreeNode* test(TreeNode* root,int low,int high){if(root == nullptr)return root;root->left = test(root->left,low,high);root->right = test(root->right,low,high);if(root->val<low || root->val>high){//不满足区间条件,根据左右子树情况返回不同值if(root->left)return root->left;if(root->right)return root->right;if(root->right == nullptr) return nullptr;}return root;//满足区间条件返回本身}TreeNode* trimBST(TreeNode* root, int low, int high) {return test(root,low,high);}
};

视频链接代码

//cpp
class Solution {
public:TreeNode* trimBST(TreeNode* root, int low, int high) {if (root == nullptr ) return nullptr;if (root->val < low) {TreeNode* right = trimBST(root->right, low, high); // 寻找符合区间[low, high]的节点return right;}if (root->val > high) {TreeNode* left = trimBST(root->left, low, high); // 寻找符合区间[low, high]的节点return left;}root->left = trimBST(root->left, low, high); // root->left接入符合条件的左孩子root->right = trimBST(root->right, low, high); // root->right接入符合条件的右孩子return root;}
};

个人问题

没有明显问题,除了花的时间有点久。


二、将有序数组转化为二叉搜索树-LeetCode 108

Leecode链接: LeetCode 108
文章链接: 代码随想录
视频链接: B站

给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵
平衡二叉搜索树。

示例:

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

思路

数组是有序的,每次取数组中间值,然后将数组切割,左区间左子树递归处理,右区间右子树递归处理。

实现代码

//cpp
class Solution {
public:TreeNode* build(vector<int>& nums,int left,int right){if(left>right){return nullptr;}int mid = (right - left)/2 + left;TreeNode* node = new TreeNode(nums[mid]);//取中间值作为父节点node->left = build(nums,left,mid - 1);node->right = build(nums,mid + 1,right);return node;}TreeNode* sortedArrayToBST(vector<int>& nums) {return build(nums,0,nums.size() - 1);}
};

个人问题

简单题,无明显问题。


三.把二叉树搜索转化为累加树-LeeCode 538

Leecode链接: LeetCode 538
文章链接: 代码随想录
视频链接: B站

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

示例:

输入:[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]

思路

题目其实大意应该是使用右中左遍历的顺序来对节点值重新赋值,使用一个全局变量来保存累加和,然后递归处理每个节点即可,理清这个意思题目就基本知道怎么写了。

实现代码

//cpp
class Solution {
public:int sum = 0;void test(TreeNode* root){if(root == nullptr){return;}test(root->right);//右子树sum = root->val + sum;//更新sum值root->val = sum;//重新赋值test(root->left);//左子树return;}TreeNode* convertBST(TreeNode* root) {test(root);return root;}
};

个人问题

简单题,无明显问题。

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

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

相关文章

项目管理-计算题公式【复习】2/2

2.【成本】相关公式 2.1挣值分析 三个参数 &#xff08;1&#xff09;计划价值(PV&#xff0c;Plan Value): PV&#xff1a;计划工作分配的经批准的预算&#xff0c;是为完成某活动或 WBS 组成部分而准备的一份经批准的预算。不包括管理储备。 注意&#xff1a;按照计划截止目…

LwIP 之九 详解 UDP RAW 编程、示例、API 源码、数据流

我们最为熟知的网络通信程序接口应该是 Socket。LwIP 自然也提供了 Socket 编程接口,不过,LwIP 的 Socket 编程接口都是使用最底层的接口来实现的。我们这里要学习的 UDP RAW 编程则是指的直接使用 LwIP 的最底层 UDP 接口来直接实现应用层功能。这里先来一张图,对 LwIP 内部…

React 和 Vue两个流行的前端 JavaScript 框架有什么区别?

设计理念&#xff1a; React 是由 Facebook 开发的&#xff0c;专注于构建 UI 组件。它采用了一种声明式的、组件化的开发模式&#xff0c;通过使用虚拟 DOM 来实现高效的 UI 更新。 Vue 是由尤雨溪开发的&#xff0c;旨在提供一个灵活且易于上手的框架。Vue 也支持组件化开发…

电商技术揭秘营销相关系列文章合集(4)

相关系列文章 电商技术揭秘相关系列文章合集&#xff08;1&#xff09; 电商技术揭秘相关系列文章合集&#xff08;2&#xff09; 电商技术揭秘相关系列文章合集&#xff08;3&#xff09; 文章目录 引言集合说明集合文章列表 引言 在数字化浪潮的推动下&#xff0c;电商行…

【35分钟掌握金融风控策略25】定额策略实战2

目录 基于收入和负债的定额策略 确定托底额度和盖帽额度 确定基础额度 基于客户风险评级确定风险系数 计算最终授信额度 确定授信有效期 基于收入和负债的定额策略 在实际生产中&#xff0c;客户的收入和负债数据大多无法直接获得&#xff0c;对于个人的收入和负债数据&…

【JavaEE】Spring Boot 入门:快速构建你的第一个 Spring Boot 应用

目录 第一个SpringBoot程序介绍项目创建创建项目目录介绍输出Hello World 第一个SpringBoot程序 介绍 在学习SpringBoot之前, 我们先来认识⼀下Spring 我们看下Spring官⽅(https://spring.io/)的介绍 可以看到, Spring让Java程序更加快速, 简单和安全. Spring对于速度、简单…

【论文阅读笔记】MapReduce: Simplified Data Processing on Large Clusters

文章目录 1 概念2 编程模型3 实现3.1 MapReduce执行流程3.2 master数据结构3.3 容错机制3.3.1 worker故障3.3.2 master故障3.3.3 出现故障时的语义 3.4 存储位置3.5 任务粒度3.6 备用任务 4 扩展技巧4.1 分区函数4.2 顺序保证4.3 Combiner函数4.4 输入和输出的类型4.5 副作用4.…

用balenaEtcher烧录ubuntu的iso文件都失败,所以选用了另一种烧录的软件Rufus,然后烧录成功了+安装ubuntu的坑

https://releases.ubuntu.com/bionic/进入网页下载ubuntu 选择烧录软件将下载的Ubuntu烧录到U盘中 之前用这个U盘烧录过一次&#xff0c;成功了&#xff0c;后来应该是U盘受损或者是什么其他原因使得用这个U盘总是烧录失败 换思路&#xff1a;由于一直使用balenaEtcher烧录ubu…

3 ESP32的PWM控制

Esp32的PWM控制也配置库函数&#xff0c;以下就是PWM所用到的函数 1 PWM通道初始化设置 函数原型uint32_t ledcSetup(uint8_t chan, uint32_t freq, uint8_t bit_num)函数功能设定指定LEDC通道的PWM信号频率和占空比分辨率返回值通道PWM信号的频率参数说明chan&#xff08;LE…

WebView基础知识以及Androidx-WebKit的使用

文章目录 摘要WebView基础一、启动调整模式二、WebChromeClient三、WebViewClient四、WebSettings五、WebView和Native交互 Androidx-WebKit一、启动安全浏览服务二、设置代理三、安全的 WebView 和 Native 通信支持四、文件传递五、深色主题的支持六、JavaScript and WebAssem…

ipa 功能包调试,分区算法,覆盖算法测试

参考 wiki 流网络 flow network 解释 相关文章 ipa 分区算法 ipa 分区算法总结&#xff0c;部分算法图解 环境 ubuntu20&#xff0c;ros 版本 noetic 运行测试 按照 readme 提示进行测试&#xff0c;跳过第一个步骤&#xff0c;并不需要 turtlebot3。 执行第三个 launch 报…

vue element checkbox的实现

实现多选非常简单: 手动添加一个el-table-column&#xff0c;设type属性为selection即可&#xff1b;默认情况下若内容过多会折行显示&#xff0c;若需要单行显示可以使用show-overflow-tooltip属性&#xff0c;它接受一个Boolean&#xff0c;为true时多余的内容会在 hover 时以…

Java8 快速实现List转map 、分组、过滤等操作

Java 8 是 Java 编程语言的一个重要版本&#xff0c;它引入了许多新特性和改进&#xff0c;使得 Java 开发变得更加高效和现代。 下面我们就来使用Java8 快速实现List转map 、分组、过滤等操作。 定义1个用户对象 public class User {private Integer id;private String nam…

计算机通信

一.进程和线程的区别? 1. 进程是资源分配的最小单位, 线程是cpu进行调度的最小单位。 2. 一个进程可以看做一个运行的程序, 一个进程中可以包含多个线程, 线程在进程内执行。 3. 多进程是指操作系统能同时运行多个任务&#xff08;程序&#xff09;&#xff0c;多线程是指在同…

数据挖掘原理与应用------分类预测

在数据挖掘和机器学习领域&#xff0c;TPR&#xff08;True Positive Rate&#xff09;是指在实际为阳性的情况下&#xff0c;模型正确预测为阳性的比例。TPR也被称为灵敏度&#xff08;Sensitivity&#xff09;或召回率&#xff08;Recall&#xff09;。它是评估分类模型性能的…

【Linux】探索 Linux du 命令:管理磁盘空间的利器

给我一个拥抱 给我肩膀靠靠 你真的不需要 对我那么好 思念就像毒药 让人受不了的煎熬 我会迷恋上瘾赖在你怀抱 &#x1f3b5; 陶钰玉《深夜地下铁》 在 Linux 系统管理中&#xff0c;磁盘空间管理是一项基础而重要的任务。du&#xff08;disk usage&#…

如何解决IntelliJ IDEA中pom.xml依赖项引发的安全漏洞黄线警告问题

背景 在开发过程中&#xff0c;当我们在pom.xml文件中添加依赖项时&#xff0c;经常会发现IntelliJ IDEA报出黄色警告线条&#xff0c;提示存在潜在的安全漏洞。警告的具体展现形式如下&#xff1a; 解决方案 首先&#xff0c;打开设置菜单界面&#xff0c;接着选择编辑器选…

vue3土味情话pinia可以持久保存再次修改App样式

我是不是你最疼爱的人-失去爱的城市 <template><div class"talk"><button click"getLoveTalk">土味情话</button><ul><li v-for"talk in talkStore.talkList" :key"talk.id">{{ talk.title }}<…

用 Supabase CLI 进行本地开发环境搭建

文章目录 &#xff08;零&#xff09;前言&#xff08;一&#xff09;Supabase CLI&#xff08;1.1&#xff09;安装 Scoop&#xff08;1.2&#xff09;用 Scoop 安装 Supabase CLI &#xff08;二&#xff09;本地项目环境&#xff08;2.1&#xff09;初始化项目&#xff08;2…

基于gin框架的文件上传(逐行解析)

基于gin框架的文件上传(逐行解析)记录一下使用gin框架完成一个文件上传的功能&#xff0c;一下是实现该功能的代码&#xff0c;适合小白&#xff0c;代码都有逐行解释&#xff01; app.go: package routerimport ("chat/service""github.com/gin-gonic/gin&qu…