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

1.LeetCode 669. 修剪二叉搜索树

题目链接:https://leetcode.cn/problems/trim-a-binary-search-tree/description/
文章链接:https://programmercarl.com/0669.修剪二叉搜索树.html
视频链接:https://www.bilibili.com/video/BV17P41177ud?share_source=copy_web

在这里插入图片描述

思路:
递归,利用二叉搜索树的性质,找到在区间内部的节点保留,并返回。
与二叉搜索树节点删除不同之处树是:
二叉搜索树节点删除是,利用性质,找到要删除的节点;
修剪是,利用性质,找到要保留的节点。

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public TreeNode trimBST(TreeNode root, int low, int high) {if (root == null) {return null;}if (root.val > high) { // 如果当前节点值大于high,则该节点的右边全部剪掉root = trimBST(root.left,low,high);} else if (root.val < low) {// 左边全部剪掉root = trimBST(root.right,low,high);} else {root.left = trimBST(root.left,low,high);root.right = trimBST(root.right,low,high);} return root;}
}

2. LeetCode 108.将有序数组转换为二叉搜索树

题目链接:https://leetcode.cn/problems/convert-sorted-array-to-binary-search-tree/description/
文章链接:https://programmercarl.com/0108.将有序数组转换为二叉搜索树.html
视频链接:https://www.bilibili.com/video/BV1uR4y1X7qL?share_source=copy_web

在这里插入图片描述

思路:
本质就是寻找分割点,分割点作为当前节点,然后递归左区间和右区间。
分割点就是数组中间位置的节点。
注意:
1️⃣如果数组长度为偶数,中间节点有两个,取哪一个?
取哪一个都可以,只不过构成了不同的平衡二叉搜索树。
2️⃣在构造二叉树的时候尽量不要重新定义左右区间数组,而是用下标来操作原数组。
3️⃣在定义区间的过程中遵循循环不变量,此处,我们设定区间是左闭右开。

解法:
/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public TreeNode sortedArrayToBST(int[] nums) {if (nums == null || nums.length == 0) {return null;}return find(nums,0,nums.length);}public TreeNode find(int[] nums,int start,int end) {if (start == end) {return null;}// 中int index = (end - start)/2 +start;TreeNode cur = new TreeNode(nums[index]); // 切割int leftStart = start;int leftEnd = index;int rightStart = index + 1;int rightEnd = end;// 左cur.left = find(nums,leftStart,leftEnd);// 右cur.right = find(nums,rightStart,rightEnd);return cur;}
}

3. LeetCode 538.把二叉搜索树转换为累加树

题目链接:https://leetcode.cn/problems/convert-bst-to-greater-tree/description/
文章链接:https://programmercarl.com/0538.把二叉搜索树转换为累加树.html
视频链接:https://www.bilibili.com/video/BV1d44y1f7wP?share_source=copy_web

在这里插入图片描述

思路:
题目要求每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。又知二叉搜索树是有序的,中序遍历左中右是单调递增的。对于一个有序的数组,要求大于等于当前值的和,需要从后向前,挨个累加,就是从最大值开始分析,逐值相加,最终求和给当前位置,也就是降序分析。要想先分析最大值,则需要采用中序遍历右中左的顺序。

解法:
/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public TreeNode convertBST(TreeNode root) {if (root == null) return null;find(root);return root;}TreeNode pre = null;public void find(TreeNode cur) {if (cur == null) return;// 右find(cur.right);// 中if (pre != null) {cur.val += pre.val;}pre = cur;// 左find(cur.left);     }
}

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

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

相关文章

【网络】网络基础(一)

网络基础&#xff08;一&#xff09; 文章目录 一、计算机网络背景1.1网络发展1.2认识“协议” 二、网络协议初识2.1OSI七层模型2.2OSI五层模型 三、网络传输基本流程3.1局域网通信3.2网络传输流程不跨子网的网络传输跨子网的网络传输 3.3网络中的地址管理IP地址MAC地址 一、计…

Kotlin中的数据类型

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

算法训练 | 图论Part1 | 98.所有可达路径

目录 98.所有可达路径 深度搜索法 98.所有可达路径 题目链接&#xff1a;98. 所有可达路径 文章讲解&#xff1a;代码随想录 深度搜索法 代码一&#xff1a;邻接矩阵写法 #include <iostream> #include <vector> using namespace std; vector<vector<…

冒泡排序写法

正宗的冒泡排序写法&#xff1a; public class BubbleSort {public static void main(String[] args) {int[] a {4,6,5,24,3,7,1};//初始化一个最大角标变量int n a.length-1;//循环轮次for (int i0;i<n;i){//从后向前开始&#xff0c;相邻元素比较大小&#xff0c;小的元…

Batch Size 不同对evaluation performance的影响

目录 问题描述如果是bugbatch size的设置问题尝试使用GroupNorm解决batchsize不同带来的问题归一化的分类 参考文章 问题描述 深度学习网络训练时&#xff0c;使用较小的batch size训练网络后&#xff0c;如果换用较大的batch size进行evaluation&#xff0c;网络的预测能力会…

Python基础001

Python输出语句 print输出字符串 print("中国四大名著&#xff1a;","西游记|","三国演义|","红楼梦|","水浒传") print(6) print(1 1)Python输入语句 input函数 input() input("我的名字是&#xff1a;") p…

efficient evolution 抗体进化模型笔记

使用到的六个esm模型&#xff1a; python bin/recommend.py --model-names, default[ esm1b, esm1v1, esm1v2, esm1v3, esm1v4, esm1v5, ] 计算概率分布&#xff1a; logits model.predict_sequence_prob(seq): 通过模型对输入序列 seq 进行预测&#xff0c;…

2023年下半年软考网络规划设计师论文真题

论文一 论虚拟化网络架构的规划与建设 随着信息技术的发展,网络以及软件厂商的产品、企业网络的规划按照NaaS模型进行演进已经成为一种共识。在NaaS的理念下,企业的IT专业人员将能够从选项菜单中订购网络基础设施组件,根据业务需求进行设计,并在短时间内交付和运行整个网…

RK3568驱动指南|第十五篇 I2C-第182章 使用Linux中默认的模拟I2C驱动程序

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

线性代数笔记

行列式 求高阶行列式 可以划上三角 上三角 余子式 范德蒙行列式 拉普拉斯公式 行列式行列对换值不变 矩阵 矩阵的运算 同型矩阵加减 对应位置相加减 矩阵的乘法 左边第 i 行 一次 相乘求和 右边 第 j 列 eg 中间相等 两边规模 矩阵的幂运算 解题思路 找规律 数学归纳…

用C语言做一个web站,富文本写入与展示,用户登录,文本目录划分

目录 1. 基础准备必备工具&#xff1a; 2. 目录结构3. 用户登录&#xff08;使用简单的文件系统管理&#xff09;4. 富文本编辑器和展示5. 样式文件6. 配置 Web 服务器7. 运行和测试 构建一个简单的 Web 站点实现富文本写入和展示、用户登录以及文本目录划分需要结合多个技术&a…

CVE-2024-6387 分析

文章目录 1. 漏洞成因2. 漏洞利用前置知识2.1 相关 SSH 协议报文格式2.2 Glibc 内存分配相关规则 3. POC3.1 堆内存布局3.2 服务端解析数据时间测量3.3 条件竞争3.4 FSOP 4. 相关挑战 原文链接&#xff1a;个人博客 近几天&#xff0c;OpenSSH爆出了一个非常严重的安全漏洞&am…

重生奇迹mu精灵之心怎么搭配

玩家可以通过召唤来召唤多种精灵之心&#xff0c;每种精灵之心增加的属性也不同。精灵之心的作用是为了提升各种各样的属性。我们可以通过召唤获得精灵之心&#xff0c;前面的解锁费用较低&#xff0c;而后面的解锁需要大量的金币来解锁。 召唤精灵之心后&#xff0c;我们可以…

OpenResty Nginx:详细对比与部署指南

简介 Nginx 和 OpenResty 都是高性能的 Web 服务器和反向代理服务器&#xff0c;但它们有着不同的特性和应用场景。Nginx 是一个轻量级的、高性能的 HTTP 和反向代理服务器&#xff0c;而 OpenResty 是基于 Nginx 的集成软件平台&#xff0c;增强了 Nginx 的功能&#xff0c;特…

数据结构(JAVA)—代码题

01-数据结构—判断题 02-数据结构—选择题 03 数据结构—多选填空程序填空 ​ 01-顺序表的建立及遍历 import java.util.Iterator; import java.util.LinkedList; import java.util.ListIterator; import java.util.Scanner;public class Main {public static void main(St…

百万数据量修改数据思路及方法

场景 公司定时任务因数据量过大运行时间太久&#xff0c;大约3-4个小时&#xff0c;需要优化代码。数据量一旦变大&#xff0c;普通的修改操作也会变得复杂。 原代码 OpsPriceServiceImpl Override public ExpireProductPriceRefeshResponse refeshExpireProductPrice(Expir…

Hadoop-09-HDFS集群 JavaClient 代码上手实战!详细附代码 安装依赖 上传下载文件 扫描列表 PUT GET 进度条显示

章节内容 上一节完成&#xff1a; HDFS的集群启动HDFS的命令行操作HDFS 上传下载移动重命名等操作 背景介绍 这里是三台公网云服务器&#xff0c;每台 2C4G&#xff0c;搭建一个Hadoop的学习环境&#xff0c;供我学习。 之前已经在 VM 虚拟机上搭建过一次&#xff0c;但是没…

QT 绘制多阶贝塞尔曲线bezier

#include "bezierline.h"BezierLine::BezierLine(QWidget *parent) {this->setParent(parent);/*阶数 &#xff1a; 公式order 2: P (1-t)^2*P0 2(1-t)*t*P1 t^2*P2order 3: P (1-t)^3*P0 3(1-t)^2*t*P1 3(1-t)*t^2*P2 t^3*P3order 4: P (1-t)^4*P0 4…

Arthas常见使用姿势

文章目录 Arthas常见使用姿势官网基本命令通用参数解释表达式核心变量说明常用命令一些常用特殊案例举例其他技巧关于OGNLOGNL的常见使用OGNL的一些特殊用法与说明OGNL内置的虚拟属性OGNL的个人思考OGNL的杂碎&#xff0c;收集未做验证 Arthas常见使用姿势 官网 https://arth…