代码随想录算法训练营第23天|669.修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树、总结篇

目录

  • 一、力扣669.修剪二叉搜索树
    • 1.1 题目
    • 1.2 思路
    • 1.3 代码
  • 二、力扣108.将有序数组转换为二叉搜索树
    • 2.1 题目
    • 2.2 思路
    • 2.3 代码
    • 2.4 总结
  • 三、力扣538.把二叉搜索树转换为累加树
    • 3.1 题目
    • 3.2 思路
    • 3.3 代码
    • 3.4 总结

一、力扣669.修剪二叉搜索树

1.1 题目

在这里插入图片描述

1.2 思路

本题递归代码分三个模块来写:
(1)递归终止条件:null节点
(2)该节点为要删除节点的处理逻辑:继续向左或者向右递归,将有效的节点返回给上层节点
(3)该节点为不需要删除节点的处理逻辑:继续向左和又递归,将有效的节点返回给本节点作为左右孩子

1.3 代码

class Solution {public TreeNode trimBST(TreeNode root, int low, int high) {//判断特殊情况if(root == null){return null;}return traversal(root,low,high);}//递归public TreeNode traversal(TreeNode root,int low,int high){//递归终止条件if(root == null){return null;}//如果当前节点是需要被删除的节点if(root.val < low){return traversal(root.right,low,high);}if(root.val > high){return traversal(root.left,low,high);}//如果该节点符合条件,不需要被删除root.left = traversal(root.left,low,high);root.right = traversal(root.right,low,high);return root;}
}

二、力扣108.将有序数组转换为二叉搜索树

2.1 题目

在这里插入图片描述

2.2 思路

注意是平衡二叉搜索树;
选取二叉树的中间节点(数组的中间数),根据数组的左右区间来构造二叉树的左右子树。

2.3 代码

lass Solution {public TreeNode sortedArrayToBST(int[] nums) {if(nums.length == 0){return null;}return traversal(nums,0,nums.length-1);}//递归,划分区间构造左右子树(坚持区间左闭右闭原则)public TreeNode traversal(int[] nums,int left,int right){//递归终止条件if(left > right){return null;}int mid = left +((right-left)>>1);//注意使用移位运算符要加括号TreeNode root = new TreeNode(nums[mid]);root.left = traversal(nums,left,mid-1);root.right = traversal(nums,mid+1,right);return root;}
}

2.4 总结

构造二叉树:有序数组选取中间节点,然后递归划分左右区间构造左右子树。
注意使用移位运算符要加括号。

三、力扣538.把二叉搜索树转换为累加树

3.1 题目

在这里插入图片描述

3.2 思路

我的思路:先将二叉树中序遍历一遍,将值记录再数组中;
第二次中序遍历时直接累加赋值(设置一个起始索引,置为0,每遍历一个节点就起始索引加一,直到遍历结束)
代码随想录:右中左

3.3 代码

我的思路:(跑出来是错的)

class Solution {public List<Integer> res = new ArrayList<>();public int quitIndex = -1; public TreeNode convertBST(TreeNode root) {if(root == null){return null;}//第一次中序遍历,从小到大拿到所有节点的值traversal(root);//第二次遍历,为节点重新赋值int sum = 0;for(int i =0;i<res.size();i++){sum += res.get(i);}traversal2(root,sum);return root;}public void traversal(TreeNode root){if(root == null){return;}//左中右traversal(root.left);res.add(root.val);traversal(root.right);}public void traversal2(TreeNode root,int sum){if(root == null){return;}//左中右traversal2(root.left,sum);if(quitIndex != -1){sum -= res.get(quitIndex);root.val = sum;quitIndex++;}else{root.val = sum;quitIndex++;}traversal2(root.right,sum);}
}

右中左(相当于从大到小遍历):

class Solution {public int beforeSum = 0;public TreeNode convertBST(TreeNode root) {//右中左递归遍历(按值从大到小)if(root == null){return null;}traversal(root);return root;}public void traversal(TreeNode root){if(root == null){return;}traversal(root.right);//中:更新本节点的值beforeSum += root.val;root.val = beforeSum;traversal(root.left);}
}

3.4 总结

还是要利用好二叉搜索树的有序特性!

二叉树总结参考代码随想录:https://programmercarl.com/%E4%BA%8C%E5%8F%89%E6%A0%91%E6%80%BB%E7%BB%93%E7%AF%87.html#%E6%9C%80%E5%90%8E%E6%80%BB%E7%BB%93
在这里插入图片描述

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

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

相关文章

day14_用户前台项目环境搭建(首页接口开发,分类接口开发,网关服务搭建,Redis缓存,Spring Cache)

文章目录 1 尚品甄选H5介绍1.1 业务功能介绍1.2 系统架构1.3 前端H5开发说明 2 搭建项目环境2.1 项目结构说明2.2 模块依赖说明2.3 环境说明2.4 项目模块创建2.4.1 spzx-parent2.4.2 spzx-service2.4.43 service-product 2.5 导入接口文档 3 首页接口开发3.1 需求分析3.3 接口开…

VScode格式化快捷键

vscode格式化代码快捷键 如何使用快捷键格式化代码。使用Java的格式去设置&#xff0c;发现不起作用。 在这里记录一下&#xff1a; 在Windows中&#xff0c;vscode格式化代码快捷键是“ShiftAltF”&#xff1b; 在Mac中&#xff0c;vscode格式化代码快捷键是“ShiftOption…

理解JavaScript中的WeakSet和WeakMap

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

RabbitMQ事务机制和确认机制

文章目录 生产者&#xff1a;RabbitMQ提供transaction和confirm模式来确保生产者不丢消息RabbitMQ 事务机制RabbitMQ确认机制 生产者&#xff1a;RabbitMQ提供transaction和confirm模式来确保生产者不丢消息 ● 通过事务实现 ● 通过发送方确认机制(publisher confirm)实现 1.…

N32L40x基于串口IAP实现(含升级工具)

bootloader实现要点 bootloader 设计要点 1.分配Flash空间,一部分用于bootloader 一部分用于 APP ,这里bootloader分配了7K空间,APP分配了121K空间 2.需要准备一个通讯接口,可以是串口,也可以时can等 3.准备mcu的内部flash驱动,可以实现连续读写的函数,flash擦除在写函…

数据结构-栈-表达式运算

文章目录 表达式运算实现&#xff1a;1.栈实现2.中缀表达式转后缀表达式计算 表达式运算实现&#xff1a; 1.栈实现 public class ExpressCalc {public static void main(String[] args) {/*使用栈实现一个0-9整数带括号的表达式计算处理步骤&#xff1a;1.创建两个栈&#x…

Yolov8-pose关键点检测:特征融合涨点篇 | 广义高效层聚合网络(GELAN) | YOLOv9

💡💡💡本文独家改进:即结合用梯度路径规划(CSPNet)和(ELAN)设计了一种广义的高效层聚合网络(GELAN),高效结合YOLOv8-pose,实现涨点。 将GELAN添加在backbone和head处,提供多个yaml改进方法 Yolov8-Pose关键点检测专栏介绍:https://blog.csdn.net/m0_6377421…

SSRF服务器请求伪造原理和pikachu靶场实验

★★免责声明★★ 文章中涉及的程序(方法)可能带有攻击性&#xff0c;仅供安全研究与学习之用&#xff0c;读者将信息做其他用途&#xff0c;由Ta承担全部法律及连带责任&#xff0c;文章作者不承担任何法律及连带责任。 1、SSRF简介 SSRF全称&#xff1a;Server-Side Request…

java两个实体类相同属性的复制

1、操作对象工具 MyBeanUtils package com.nrxt.nms.mon.pt.cascade.utils;import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; import org.springframework.beans.BeansEx…

017集——圆弧(ARC)转多段线(lwpolyline)——cad vba 中按一定精度拟合加点实现

在国土资源管理项目中&#xff0c;我们经常会遇到CAD转gis数据实现入库&#xff0c;而cad中的arc圆弧转为gis数据只能转出弧的顶点坐标&#xff0c;导致图形变形失真。若一个一个对弧进行手工增加点转为多段线&#xff0c;耗时耗力&#xff0c;效率极其低下。这里给出解决方案&…

C#(C Sharp)学习笔记_字符串的常用操作方法【十一】

文章目录 索引字符串( Index )遍历字符串( for )拆分字符串( Split )替代字符串( Replace )提取字符串( Substring )插入字符串( Insert )移除字符串( Remove ) 索引字符串( Index ) 当我们要查看字符串中的某个字符时&#xff0c;我们可以使用索引功能。 string ax "我…

继承杂谈。

内容一览 前言继承的概念及定义继承的意义继承关系及访问限定符父类和子类对象之间的转化继承后的作用域继承与有元继承与静态成员多继承继承和组合的区别&#xff1a;继承的总结和反思 前言 面向对象的三大特性&#xff1a;封装继承和多态&#xff0c;这三种特性优者很紧密地联…

【Prometheus】PromQL

数据类型 即时向量&#xff08;instant vector&#xff09; node_cpu_seconds_total{instance"ahoj-dev-ubuntu-virtualbox",mode"idle"} 区间向量&#xff08;range vector&#xff09; node_cpu_seconds_total{instance"ahoj-dev-ubuntu-virtu…

手拉手RocketMQ基础

消息中间件的对比 消息中间件 ActiveMQ RabbitMQ RocketMQ kafka 开发语言 java erlang java scala 单击吞吐量 万级 万级 10万级 10万级 时效性 ms us ms ms 可用性 高(主从架构) 高(主从架构) 非常高(主从架构) 非常高(主从架构) 消息中间件: activ…

MetaGPT部分源码解读

Action SerializationMixin&#xff1a; Pydantic在序列化一个对象时&#xff0c;会将其序列化为其最顶层父类的形式&#xff0c;而不是它实际子类的形式。这意味着&#xff0c;如果你有一个父类和一个继承自该父类的子类&#xff0c;当你将子类的实例序列化时&#xff0c;得到…

HTTP常见报错响应码

HTTP 响应状态代码指示特定 HTTP 请求是否已成功完成。响应分为五类&#xff1a; 信息响应成功响应重定向客户端错误服务器错误 1 、信息响应 100 Continue 这个临时响应表明&#xff0c;迄今为止的所有内容都是可行的&#xff0c;客户端应该继续请求&#xff0c;如果已经完 …

云上攻防-云产品篇堡垒机场景JumpServer绿盟SASTeleport麒麟齐治

知识点 1、云产品-堡垒机-产品介绍&攻击事件 2、云产品-堡垒机-安全漏洞&影响产品 章节点&#xff1a; 云场景攻防&#xff1a;公有云&#xff0c;私有云&#xff0c;混合云&#xff0c;虚拟化集群&#xff0c;云桌面等 云厂商攻防&#xff1a;阿里云&#xff0c;腾讯…

k8a 对外服务(ingress)详解(定义,暴露,代理,重写,)

目录 一、 对外服务 service策略的作用 外部访问方案 适用场景和限制 ingress如何实现对外服务 ingress 概念 定义 组成 工作原理 总结 二、 部署 nginx-ingress-controller 创建 ingress-controller pod及相关资源 创建目录&#xff1a; 下载配置文件 修改 集群…

CSS拖曳盒子案例

让我为大家带来一个小案例吧&#xff01; <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style>* {margin: 0;padding: 0;}.box1 {width: 100px;height: 100px;background-color: black;margin-bot…

iMazing3 2024详细解析数据备份与恢复备份

iMazing 3的备份功能支持增量备份&#xff08;类似苹果电脑里的Time Machine功能&#xff09;&#xff0c;意思是第一次把移动设备的数据全部备份下来&#xff0c;之后的备份就只针对数据有变化的那部分&#xff0c;这样可以节省大量的时间和存储空间&#xff0c;不会让使用者为…