代码随想录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.rhkb.cn/news/385351.html

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

相关文章

基于Neo4j将知识图谱用于检索增强生成:Knowledge Graphs for RAG

Knowledge Graphs for RAG 本文是学习https://www.deeplearning.ai/short-courses/knowledge-graphs-rag/这门课的学习笔记。 What you’ll learn in this course Knowledge graphs are used in development to structure complex data relationships, drive intelligent sea…

【BUG】已解决:UnicodeDecodeError: ‘utf-8’ codec can’t decode bytes in position 10

UnicodeDecodeError: ‘utf-8’ codec can’t decode bytes in position 10 目录 UnicodeDecodeError: ‘utf-8’ codec can’t decode bytes in position 10 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#x…

SpringBoot3 JDK21 Vue3开源后台RBAC管理系统 | 2024年好用的开源RBAC管理系统 | 数据权限的探索

序言 项目现已全面开源&#xff0c;商业用途完全免费&#xff01; 当前版本&#xff1a;v0.7.2。 如果喜欢这个项目或支持作者&#xff0c;欢迎Star、Fork、Watch 一键三连 &#x1f680;&#xff01;&#xff01; 在构建此代码框架的过程中&#xff0c;我已投入了大量精力&…

Flink内存管理机制

前言 在Flink的后台界面&#xff0c;可以看到整个Flink的内存情况。 如JobManager的内存情况&#xff1a; TaskManager的内存情况 一、Flink内存管理 Flink TaskManager内存组成整体结构图如下&#xff1a; 二、总内存管理 三、JobManager内存管理内存管理 四、TaskManager内…

视频主题Qinmei 3.0视频站源码_WordPress影视视频主题/附详细安装教程

Qinmei 3.0主题主要是将 wordpress 改造成纯 api 的站点&#xff0c;以便实现前后端分离的技术栈&#xff0c;目前的进度已经大致完成&#xff0c;唯一的问题就是需要安装 JWT token 插件。 功能介绍&#xff1a; 支持豆瓣以及 bangumi 的一键获取信息, 豆瓣 api 目前使用的是…

blender顶点乱飞的问题解决

初学blender&#xff0c;编辑模式下移动某些顶点&#xff0c;不管是移动还是滑动都会出现定点乱飞的问题&#xff0c;后来才发现是开了吸附工具的原因&#xff01;&#xff01;&#xff01;&#xff01; 像下面这样&#xff0c;其实我只是在Z轴上移动&#xff0c;但是就跑的很…

02 Golang面向对象编程_20240727 课程笔记

视频课程 最近发现越来越多的公司在用Golang了&#xff0c;所以精心整理了一套视频教程给大家&#xff0c;这个是其中的第二部&#xff0c;后续还会有很多。 视频已经录制完成&#xff0c;完整目录截图如下&#xff1a; 课程目录 01 结构体的声明.mp402 使用var根据结构体…

SQL labs-SQL注入(四,sqlmap对于post传参方式的注入)

本文仅作为学习参考使用&#xff0c;本文作者对任何使用本文进行渗透攻击破坏不负任何责任。 序言&#xff1a;本文主要讲解基于SQL labs靶场&#xff0c;sqlmap工具进行的post传参方式的SQL注入。 传参方式有两类&#xff0c;一类是直接在url栏内进行url编码后进行的传参&am…

K8s 核心组件——API Server

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

杂谈(杂鱼谈论c语言)——2.大小端字节序

⼤⼩端字节序和字节序判断 当我们了解了整数在内存中存储后&#xff0c;我们调试看⼀个细节&#xff1a; #include <stdio.h> int main() {int a 0x11223344;return 0; } 调试的时候&#xff0c;我们可以看到在a中的 0x11223344 这个数字是按照字节为单位&#xff0c;…

渗透测试 - 攻击思路与手段、工具分享

导语&#xff1a; 我在CSDN活跃已有6年&#xff0c;这是国内最优秀的IT学习平台之一。尽管有人对其持批评态度&#xff0c;我个人认为它拥有独特的优势。 最近我参加了一场网络安全工作的面试&#xff0c;在广州与面试官深入交流了半个多小时。尽管未能通过面试&#xff0c;但这…

【Android】linux

android系统就是跑在linux上的系统。Linux层里面包含系统和硬件驱动等一些本地代码的环境。 linux的目录 mount: 用于查看哪个模块输入只读&#xff0c;一般显示为&#xff1a; [rootlocalhost ~]# mount /dev/cciss/c0d0p2 on / type ext3 (rw) proc on /proc type proc (…

真诚推荐3款超实用工具,强大好用到停不下来

Screen Studio Screen Studio是一款专为macOS设计的屏幕录制和视频编辑软件&#xff0c;具有多种功能和特点&#xff0c;使其成为内容创作者、教育工作者和专业人士的重要工具。它不仅支持屏幕录制&#xff0c;还支持摄像头和麦克风录制&#xff0c;可以创建精美的视频&#xf…

C# 植物大战僵尸

Winform 版本开发 高效率、流畅植物大战僵尸 git地址&#xff1a;冯腾飞/植物大战僵尸

UE4-构建光照后导入的静态网格体变黑

当我们将我们的静态网格体导入到项目当中的时候&#xff0c;此时我们进行重新构建光照&#xff0c;我们在从新构建完光照后&#xff0c;会发现我们的静态网格体全部变黑了&#xff0c;此时是因为没有设置光照贴图分辨率和坐标索引引起的。 将General Settings中的L…

websocket通信问题排查思路

websocket通信问题排查思路 一、websocket连接成功&#xff0c;但数据完全推不过来。 通过抓包发现&#xff0c;是回包时间太长超过了1分钟导致的。这种通常是推送数据的线程有问题导致的。 正常抓包的情况如下&#xff1a; 二、大量数据可以正常推送成功&#xff0c;不定时…

240728pycharm使用问题之无法找到指定命令

文章目录 1.问题描述2.分析3.解决后界面展示 1.问题描述 pycharm中断报错,让你初始化powershell,并且说找不到anconda中指定命令,很明显anaconda环境配置不对 2.分析 1.检查anaconda环境变量配置是否ok; 2.检查pycharm终端配置是否ok 3.检查pyacharm环境配置 3.解决后界面展…

《Single-Stage Extensive Semantic Fusion for multi-modal sarcasm detection》

系列论文研读目录 文章目录 系列论文研读目录文章题目含义ABSTRACTKeywords1. Introduction2. Related work3. Method3.1. Multi-modal projection 多模态投影3.2. Extensive Semantic Fusion Multiway Transformer 可拓语义融合多路Transformer3.3. Multi-objective optimizat…

WordPress文章标题定制化前缀插件

引言 在当今互联网的海洋中&#xff0c;吸引读者眼球的第一步往往始于文章标题的设计。对于WordPress博主而言&#xff0c;如何让每篇文章的标题更加个性化和吸引人&#xff0c;成为了一项重要的任务。传统的自定义CSS方法虽然可行&#xff0c;但其繁琐的操作和有限的美学效果…

【计算机网络】TCP负载均衡实验

一&#xff1a;实验目的 1&#xff1a;了解TCP负载均衡的配置。 2&#xff1a;学会使用NAT技术处理和外部网络的连接。 二&#xff1a;实验仪器设备及软件 硬件&#xff1a;RCMS交换机、网线、内网网卡接口、Windows 2019操作系统的计算机等。具体为&#xff1a;二层交换机1…