代码学习记录19

随想录日记part19

t i m e : time: time 2024.03.14



主要内容:今天的主要内容是二叉树的第七部分,主要涉及修剪二叉搜索树 ;将有序数组转换为二叉搜索树;把二叉搜索树转换为累加树。

  • 669. 修剪二叉搜索树
  • 108.将有序数组转换为二叉搜索树
  • 538.把二叉搜索树转换为累加树


Topic1修剪二叉搜索树

题目:

给你二叉搜索树的根节点 r o o t root root,同时给定最小边界 l o w low low 和最大边界 h i g h high high。通过修剪二叉搜索树,使得所有节点的值在 [ l o w , h i g h ] [low, high] [low,high] 中。修剪树不应该改变保留在树中的元素的相对结构 (即,如果没有被移除,原有的父代子代关系都应当保留)。 可以证明,存在唯一的答案 。所以结果应当返回修剪好的二叉搜索树的新的根节点。注意,根节点可能会根据给定的边界发生改变。
示例:
请添加图片描述

输入: r o o t = [ 3 , 0 , 4 , n u l l , 2 , n u l l , n u l l , 1 ] , l o w = 1 , h i g h = 3 root = [3,0,4,null,2,null,null,1], low = 1, high = 3 root=[3,0,4,null,2,null,null,1],low=1,high=3
输出: [ 3 , 2 , n u l l , 1 ] [3,2,null,1] [3,2,null,1]

思路:

递归三部曲如下:

  • 确定递归函数返回值以及参数
TreeNode trimBST(TreeNode root, int low, int high)
  • 确定终止条件:修剪的操作并不是在终止条件上进行的,所以就是遇到空节点返回就可以了。
if (root == null)return null;
  • 确定单层递归的逻辑
    1.如果 r o o t root root(当前节点)的元素小于 l o w low low 的数值,那么应该递归右子树,并返回右子树符合条件的结点。
    2.如果 r o o t root root(当前节点)的元素大于 h i g h high high的,那么应该递归左子树,并返回左子树符合条件的头结点。
    3.接下来要将下一层处理完左子树的结果赋给 r o o t . l e f t root.left root.left,处理完右子树的结果赋给 r o o t . r i g h t root.right root.right ,最后返回root节点。
if (root.val < low) {return trimBST(root.right, low, high);} else if (root.val > high) {return trimBST(root.left, low, high);} else {TreeNode left = trimBST(root.left, low, root.val - 1);TreeNode right = trimBST(root.right, root.val + 1, high);root.left = left;root.right = right;return root;}

完整代码如下:

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);} else if (root.val > high) {return trimBST(root.left, low, high);} else {TreeNode left = trimBST(root.left, low, root.val - 1);TreeNode right = trimBST(root.right, root.val + 1, high);root.left = left;root.right = right;return root;}}
}


Topic2将有序数组转换为二叉搜索树

题目:

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

请添加图片描述

输入: n u m s = [ − 10 , − 3 , 0 , 5 , 9 ] nums = [-10,-3,0,5,9] nums=[10,3,0,5,9]
输出: [ 0 , − 3 , 9 , − 10 , n u l l , 5 ] [0,-3,9,-10,null,5] [0,3,9,10,null,5]
解释: [0,-10,5,null,-3,null,9] 也将被视为正确答案:
请添加图片描述

思路: 为了保证是平衡二叉树,我们使用二分原始数组进行递归建立。
递归三部曲:

  • 确定递归函数参数以及返回值
TreeNode sort(int[] nums, int start, int end)
  • 确定终止条件

这里定义的是左闭右闭的区间,所以当区间 s t a r t > e n d start > end start>end 的时候,就是空节点了

if (start > end)return null;
  • 确定单层递归的逻辑
if (start == end) {TreeNode tem = new TreeNode(nums[start]);return tem;} else {int mid = (start + end) / 2;if (mid == start) {TreeNode root = new TreeNode(nums[mid]);root.right = sort(nums, mid + 1, end);return root;} else {TreeNode root = new TreeNode(nums[mid]);root.left = sort(nums, start, mid - 1);root.right = sort(nums, mid + 1, end);return root;}}

总体代码如下: 递归法:

class Solution {public TreeNode sortedArrayToBST(int[] nums) {return sort(nums, 0, nums.length - 1);}private TreeNode sort(int[] nums, int start, int end) {if (start > end)return null;if (start == end) {TreeNode tem = new TreeNode(nums[start]);return tem;} else {int mid = (start + end) / 2;if (mid == start) {TreeNode root = new TreeNode(nums[mid]);root.right = sort(nums, mid + 1, end);return root;} else {TreeNode root = new TreeNode(nums[mid]);root.left = sort(nums, start, mid - 1);root.right = sort(nums, mid + 1, end);return root;}}}
}


Topic3把二叉搜索树转换为累加树

题目:

给出二叉搜索树的根节点,该树的节点值各不相同,请你将其转换为累加树( G r e a t e r S u m T r e e Greater\ Sum\ Tree Greater Sum Tree),使每个节点 n o d e node node 的新值等于原树中大于或等于 n o d e . v a l node.val node.val 的值之和。

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

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

示例:
请添加图片描述

输入: [ 4 , 1 , 6 , 0 , 2 , 5 , 7 , n u l l , n u l l , n u l l , 3 , n u l l , n u l l , n u l l , 8 ] [4,1,6,0,2,5,7,null,null,null,3,null,null,null,8] [4,1,6,0,2,5,7,null,null,null,3,null,null,null,8]
输出: [ 30 , 36 , 21 , 36 , 35 , 26 , 15 , n u l l , n u l l , n u l l , 33 , n u l l , n u l l , n u l l , 8 ] [30,36,21,36,35,26,15,null,null,null,33,null,null,null,8] [30,36,21,36,35,26,15,null,null,null,33,null,null,null,8]

思路:

递归三部曲:

  • 确定递归函数参数以及返回值
 void trans(TreeNode root)int pre; 
  • 确定终止条件

遇到空返回

if(root==null) return;
  • 确定单层递归的逻辑
    按照右中左递归就行
trans(root.right);//右边root.val=pre+root.val;//中pre=root.val;trans(root.left);//左边

总体代码如下: 递归法:

class Solution {int pre;private void trans(TreeNode root) {if (root == null)return;trans(root.right);// 右边root.val = pre + root.val;// 中pre = root.val;trans(root.left);// 左边}public TreeNode convertBST(TreeNode root) {pre = 0;trans(root);return root;}
}

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

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

相关文章

【UE5】非持枪状态蹲姿移动的动画混合空间

项目资源文末百度网盘自取 在BlendSpace文件夹中单击右键选择动画(Animation)中的混合空间(Blend Space) &#xff0c;选择SK_Female_Skeleton&#xff0c;命名为BS_NormalCrouch 打开BS_NormalCrouch 水平轴表示角色的方向&#xff0c;命名为Direction&#xff0c;方向的最…

原生php单元测试示例

下载phpunit.phar https://phpunit.de/getting-started/phpunit-9.html 官网 然后win点击这里下载 新建目录 这里目录可以作为参考&#xff0c;然后放在根目录下 新建一个示例类 <?phpdeclare(strict_types1);namespace Hjj\DesignPatterns\Creational\Hello;class He…

Flutter可重排的列表控件ReorderableListView详解

文章目录 ReorderableListView 介绍主要属性使用示例注意事项 ReorderableListView 介绍 ReorderableListView 是 Flutter 中一个可重排的列表控件&#xff0c;允许用户通过拖动来改变列表项的顺序。它继承自 ListView&#xff0c;并提供了一些额外的功能来实现重排功能。 主…

安卓通过termux部署ChatGLM

一、安装Termux并进行相关配置 1、安装termux Termux 是一个 Android 终端仿真应用程序&#xff0c;用于在 Android 手机上搭建一个完整的 Linux 环境。 不需要 root 权限 Termux 就可以正常运行。Termux 基本实现 Linux 下的许多基本操作。可以使用 Termux 安装 python&…

DB算法原理与构建

参考&#xff1a; https://aistudio.baidu.com/projectdetail/4483048 Real-Time Scene Text Detection with Differentiable Binarization 如何读论文-by 李沐 DB (Real-Time Scene Text Detection with Differentiable Binarization) 原理 DB是一个基于分割的文本检测算…

区块链基础知识(上):区块链基本原理、加密哈希、公钥加密

目录 基本原理 加密哈希&#xff1a; 公钥加密&#xff1a; 希望有人向你发送只有你才能打开的加密文档/消息时使用 PKC 希望向其他人发送加密文档/消息并证明它确实由你发送时使用 PKC 使用 PKC 和加密哈希对文档/消息进行数字签名 交易哈希链使用数字签名转让数字资产所…

SenseNova 商汤日日新大模型 Function Call(函数调用)功能讲解和应用示例

考虑到使用 magic 申请 OpenAPI 的账号挺麻烦的&#xff0c;这里以商汤日日新大模型 SenseNova 介绍 Function Call 的功能。 官方链接&#xff1a;日日新开放平台 一、Function Call 是个啥&#xff1f; 在 LLM&#xff08;Large Language Model&#xff09; 语言大模型时代&…

YOLOv9实例分割教程|(二)验证教程

专栏地址&#xff1a;目前售价售价59.9&#xff0c;改进点30个 专栏介绍&#xff1a;YOLOv9改进系列 | 包含深度学习最新创新&#xff0c;助力高效涨点&#xff01;&#xff01;&#xff01; 一、验证 打开分割验证文件&#xff0c;填入数据集配置文件、训练好的权重文件&…

报告合集 |2023年,5份必读的“数字孪生”行业报告合集(文末下载)

数字孪生正在快速改变多个行业的面貌。它通过创建物理世界对象的虚拟复制&#xff0c;使得数据分析和系统优化能够在数字空间中实现&#xff0c;正在制造业、城市规划、医疗保健等国家支柱行业展现出巨大的变革力量&#xff0c;为行业的智能决策和预测提供了强大的支撑。 作为…

【UE】AI行为树入门——以小白人跟踪玩家并攻击为例

目录 前言 效果 步骤 一、准备工作 二、用蓝图实现AI随机移动 三、用行为树实现AI随机移动与跟踪玩家并攻击的效果 3.1 AI随机移动 3.2 AI看到玩家后跟踪玩家 3.3 AI攻击玩家 前言 本篇文章要实现的效果是&#xff1a;小白人随机移动&#xff0c;并且在移动过程中如…

电玩城游戏大厅计时软件怎么用,佳易王计时计费管理系统软件定时语音提醒操作教程

电玩城游戏大厅计时软件怎么用&#xff0c;佳易王计时计费管理系统软件定时语音提醒操作教程 一、前言 以下软件操作教程以 佳易王电玩计时计费软件V18.0为例 说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 1、软件计时计费&#xff0c;只需点击开…

国际前十正规外汇实时行情走势app软件最新排名(综合版)

外汇交易&#xff0c;作为当今世界金融市场上一个重要的板块&#xff0c;备受关注和热议。随着金融市场的日益发展&#xff0c;外汇交易也发展成为一个新兴的投资交易渠道。为了更好地满足投资者对外汇市场的需求&#xff0c;外汇实时行情走势app软件应运而生&#xff0c;它为投…

Material UI 5 学习03-Text Field文本输入框

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 Text Field文本输入框 一、最基本的本文输入框1、基础示例2、一些表单属性3、验证 二、多行文本 一、最基本的本文输入框 1、基础示例 import {Box, TextField} from "…

【Python】新手入门学习:详细介绍里氏替换原则(LSP)及其作用、代码示例

【Python】新手入门学习&#xff1a;详细介绍里氏替换原则&#xff08;LSP&#xff09;及其作用、代码示例 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyT…

前端基础篇-深入了解 JavaScript(一)

文章目录 1.0 JavaScript 概述 2.0 JS - 引入方式 3.0 JS - 基础语法 4.0 JS - 数据类型 5.0 JS - 函数 6.0 JS - Array 数组 7.0 JS - String 字符串 1.0 JavaScript 概述 JavaScript(简称&#xff1a;JS)是一门夸平台、面向对象的脚本语言。使用来控制网页行为&#xff0c;它…

C++训练营:引用传递

大家好&#xff1a; 衷心希望各位点赞。 您的问题请留在评论区&#xff0c;我会及时回答。 一、引用传递 简单来说&#xff0c;“引用”就是给已有的变量起一个别名。引用并没有自己单独的内存空间&#xff0c;作为引用&#xff0c;它和原变量共用一段内存空间。引用的定义格…

算法空间复杂度计算

目录 空间复杂度定义 影响空间复杂度的因素 算法在运行过程中临时占用的存储空间讲解 例子 斐波那契数列递归算法的性能分析 二分法&#xff08;递归实现&#xff09;的性能分析 空间复杂度定义 空间复杂度(Space Complexity)是对一个算法在运行过程中临时占用存储空间大…

Springboot中Redis的配置使用

新建 向pom.xml中添加依赖&#xff0c;这个可以不用标注版本号 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency> 配置yml文件&#xff08;文件名不可以错…

钉钉与实在智能达成战略合作,实在Agent助力钉钉AI助理成为“新质生产力”

3月12日&#xff0c;浙江实在智能科技有限公司&#xff08;简称“实在智能”&#xff09;与钉钉&#xff08;中国&#xff09;信息技术有限公司&#xff08;简称“钉钉”&#xff09;签署战略合作协议&#xff0c;达成战略合作伙伴关系。 未来&#xff0c;基于双方创新领先的技…

echarts - 鼠标事件详解

一、echarts 事件概念 chart.on(eventName, query, handler);1. 鼠标事件类型 eventName ECharts 支持9种常规的鼠标事件类型&#xff0c;包括click、 dblclick、 mousedown、mousemove、mouseup、mouseover、 mouseout、 globalout、contextmenu事件。 click&#xff1a;鼠…