今日总结:

        1、修剪二叉搜索树(重点思考如何修剪)

                (1)递归的返回值是什么?(与插入、删除一样)

                (2)递归的单层逻辑一定要缕清(3中情况讨论)

        2、将有序数组转化为二叉搜索树(简单)

        3、把二叉搜索树转换为累加树

                需要思考出所谓的累加树就是从右下角开始,逆中序遍历,将前一个值加到当前值中,所以与中序遍历对当前值操作一样,需要使用一个全局变量记录前一个节点。

修剪二叉搜索树

题目链接:669. 修剪二叉搜索树 - 力扣(LeetCode)

整体思路:

        思路1:笨方法(不行,因为不能改变树的原本结构)

               1、 将二叉搜索树变化为有序数组(中序遍历)
                2、将有序数组减枝
                3、将数组排列成二叉搜索树

        思路2:递归

                本质上就是判断当前节点的值是不是在目标区间中:

                        1、小于目标区间:要删除当前节点,当前节点的左子树一定小于目标区间,去递归当前节点的右子树,寻找右子树是不是存在符合目标区间的节点,将该节点作为当前节点返回

                        2、大于目标区间:要删除当前节点,当前节点的右子树一定大于目标区间,去递归当前节点的左子树,寻找左子树是不是存在符合目标区间的节点,将该节点作为当前节点返回

                        3、在目标区间中:不能直接返回当前节点,因为不知道当前节点的左右子树中是不是存在不满足区间的节点,所以需要递归左右子树,更新当前节点的左右子节点后再返回当前节点。

        思路2整体代码

/*** Definition for a binary tree node.* 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://递归//整体目标:判断当前节点是不是在区间内//小于区间,删除当前节点,遍历右子树,符合区间的节点返回//大于区间:删除当前节点,遍历左子树,符合区间的节点返回//在区间中:遍历其左右子节点,删除不符合的节点,返回当前节点//返回值:当前修剪完的节点//输入值:当前节点、区间TreeNode* digui(TreeNode* cur, int low, int high){//停止条件:空节点if(cur==nullptr)return nullptr;//单程递归逻辑:上边已经写出了if(cur->val<low){return digui(cur->right,low,high);}else if(cur->val>high){return digui(cur->left,low,high);}//在区间内,需要判断左右子树是不是符合条件cur->left = digui(cur->left,low,high);cur->right =digui(cur->right,low,high);return cur;}TreeNode* trimBST(TreeNode* root, int low, int high) {return digui(root,low,high);}
};

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

题目链接:108. 将有序数组转换为二叉搜索树 - 力扣(LeetCode)

整体思路:

        二分法将数组分成两部分,递归构造

                返回值:

                        当前节点

                输入值:

                        数组

                停止:

                        数组空

                单层逻辑:

                       1、 寻找数组中间值

                        2、分成两个数组

                        3、构建一个节点,值为中间值

                        4、左子节点递归

                        5、右子节点递归

                        6、返回当前节点

整体代码:

/*** Definition for a binary tree node.* 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:TreeNode* digui(vector<int>& nums){if(nums.size()==0)return nullptr;//中间值int mid = nums.size()/2;TreeNode* cur = new TreeNode(nums[mid]);vector <int>res_left (nums.begin(),nums.begin()+mid);vector <int>res_right (nums.begin()+mid+1,nums.end());cur->left = digui(res_left);cur->right =digui(res_right);return cur;}TreeNode* sortedArrayToBST(vector<int>& nums) {return digui(nums);}
};

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

题目链接:538. 把二叉搜索树转换为累加树 - 力扣(LeetCode)

整体思路:

        累加树:当前节点的值加上比当前节点值大的节点的所有值构建的树

        二叉搜索树:当前节点左子树的值全部比当前节点的值小;当前节点的右子树的值全部比当前节点的值大。

        分析可知二叉搜索树与累加树的关系:当前节点的值加上当前节点的右子树的值之和

        从右下开始遍历(逆中序遍历),而不是从左下开始(中序遍历),每次遍历将当前节点的值变为前边所有值之和。

        1、递归的返回值,输入值

                返回值:无需返回值

                输入值:当前节点

        2、递归的停止条件:

                遇到空节点

        3、单层递归逻辑

                与中序遍历相反,先遍历右子节点、再对当前节点做加和,再遍历左子节点。

                因为是单纯的中序遍历,修改当前节点问题,需要知道前一个节点的值,所以需要使用一个全局变量去记录前一个节点

整体代码:

/*** Definition for a binary tree node.* 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://逆中序遍历递归,需要一个值去记录前一个节点的值TreeNode* res= nullptr;//返回值:更新的当前节点//输入值:当前节点void digui(TreeNode* cur){   //空节点停止if(cur==nullptr){return ;}//单层递归,逆中序遍历digui(cur->right);if(res!=nullptr)cur->val =cur->val+ res->val;res = cur;digui(cur->left);}TreeNode* convertBST(TreeNode* root) {digui(root);return root;}
};

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

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

相关文章

C# 多线程(三)线程池

目录 1.通过TPL使用线程池 2.不使用TPL进入线程池的办法 异步委托 3.线程池优化技术 最小线程数的工作原理 每当启动一个新线程时&#xff0c;系统都需要花费数百微秒来分配资源&#xff0c;例如创建独立的局部变量栈空间。默认情况下&#xff0c;每个线程还会占用约1…

学习笔记(29):训练集与测试集划分详解:train_test_split 函数深度解析

学习笔记(29):训练集与测试集划分详解&#xff1a;train_test_split 函数深度解析 一、为什么需要划分训练集和测试集&#xff1f; 在机器学习中&#xff0c;模型需要经历两个核心阶段&#xff1a; 训练阶段&#xff1a;用训练集数据学习特征与目标值的映射关系&#xff08;…

【全网唯一】自动化编辑器 Windows版纯本地离线文字识别插件

目的 自动化编辑器超轻量级RPA工具&#xff0c;零代码制作RPA自动化任务&#xff0c;解放双手&#xff0c;释放双眼&#xff0c;轻松玩游戏&#xff0c;刷任务。本篇文章主要讲解下自动化编辑器的TomatoOCR纯本地离线文字识别Windows版插件如何使用和集成。 准备工作 1、下载自…

GitHub 2FA绑定

GitHub 2FA绑定 作为全球最大的代码托管平台&#xff0c;GitHub对账号安全的重视程度不断提升——自2023年3月起&#xff0c;GitHub已要求所有在GitHub.com上贡献代码的用户必须启用双因素身份验证&#xff08;2FA&#xff09;。如果你是符合条件的用户&#xff0c;会收到一封…

pytest fixture基础大全详解

一、介绍 作用 fixture主要有两个作用&#xff1a; 复用测试数据和环境&#xff0c;可以减少重复的代码&#xff1b;可以在测试用例运行前和运行后设置和清理资源&#xff0c;避免对测试结果产生影响&#xff0c;同时也可以提高测试用例的运行效率。 优势 pytest框架的fix…

Unity知识点-Renderer常用材质变量

本篇总结了Unity中renderer的3种常用的材质相关的变量&#xff1a;renderer.material,renderer.sharedMaterial,renderer.MaterialPropertyBlock。以及三者对SRPBatcher的影响。 一.介绍及对比 1.概念介绍 1.material 定义&#xff1a;material 是Render组件&#xff08;如…

【算法】​​如何判断时间复杂度?

文章目录 1. 什么是时间复杂度&#xff1f;为什么需要时间复杂度&#xff1f; 2. 常见时间复杂度对比3. 如何分析时间复杂度&#xff1f;&#xff08;Java版&#xff09;&#x1f539; 步骤1&#xff1a;找出基本操作&#x1f539; 步骤2&#xff1a;分析循环结构&#xff08;1…

MySQL使用C语言连接

文章目录 版本查看以及编译mysql接口介绍初始化链接数据库下发mysql命令mysql_query获取执行结果mysql_store_result获取结果行数mysql_num_rows获取结果列数mysql_num_fields获取列名mysql_fetch_fields获取结果内容mysql_fetch_row关闭mysql链接mysql_closeC语言操作mysql查看…

坚持每日Codeforces三题挑战:Day 7 - 题目详解(2025-06-11,难度:1200,1300,1500)

每天坚持写三道题第七天&#xff1a; Problem - A - Codeforces 1200 Problem - B - Codeforces 1300 Problem - A - Codeforces 1500 目录 题目一: 题目大意: 解题思路: 代码(C): 题目二: 题目大意: 解题思路: 代码(C): 题目三: 题目大意: 解题思路: 代码(C): …

洛谷 P4305:[JLOI2011] 不重复数字 ← unordered_set

【题目来源】 https://www.luogu.com.cn/problem/P4305 【题目描述】 给定 n 个数&#xff0c;要求把其中重复的去掉&#xff0c;只保留第一次出现的数。 【输入格式】 第一行一个整数 T&#xff0c;表示数据组数。 对于每组数据&#xff0c;第一行一个整数 n。第二行 n 个数…

STM32固件升级设计——SPIFLASH模拟U盘升级固件

目录 概述 一、功能描述 1、BootLoader部分&#xff1a; 2、APP部分&#xff1a; 二、BootLoader程序制作 1、分区定义 2、 主函数 3、配置USB 4、配置fatfs文件系统 5、程序跳转 三、APP程序制作 四、工程配置&#xff08;默认KEIL5&#xff09; 五、运行测试 六…

解锁阿里云日志服务SLS:云时代的日志管理利器

引言&#xff1a;开启日志管理新篇 在云计算时代&#xff0c;数据如同企业的血液&#xff0c;源源不断地产生并流动。从用户的每一次点击&#xff0c;到系统后台的每一个操作&#xff0c;数据都在记录着企业运营的轨迹。而在这些海量的数据中&#xff0c;日志数据占据着至关重…

Keye-VL-8B-Preview:由快手 Kwai Keye 团队精心打造的尖端多模态大语言模型

&#x1f525; News 2025.06.26 &#x1f31f; 我们非常自豪地推出Kwai Keye-VL&#xff0c;这是快手Kwai Keye团队精心打造的前沿多模态大语言模型。作为快手先进技术生态中的核心AI产品&#xff0c;Keye在视频理解、视觉感知和推理任务方面表现卓越&#xff0c;树立了新的性…

Web前端之JavaScript实现图片圆环、圆环元素根据角度指向圆心、translate、rotate

MENU 前言效果HtmlStyleJavaScript 前言 代码段创建了一个由6个WiFi图标组成的圆形排列&#xff0c;每个图标均匀分布在圆周上。 效果 Html 代码 <div class"ring"><div class"item"><img class"img" src"../image/icon/W…

1 Studying《Computer Vision: Algorithms and Applications 2nd Edition》11-15

目录 Chapter 11 Structure from motion and SLAM 11.1 几何内禀校准 11.2 姿态估计 11.3 从运动中获得的双帧结构 11.4 从运动中提取多帧结构 11.5 同步定位与建图&#xff08;SLAM&#xff09; 11.6 额外阅读 Chapter 12 Depth estimation 12.1 极点几何 12.2 稀疏…

phpstudy 可以按照mysql 数据库

phpstudy 可以按照mysql 数据库 PHPStudy&#xff08;小皮面板&#xff09;是一款专为开发者设计的集成环境工具&#xff0c;涵盖服务器配置、开发环境搭建、网站部署等多项功能。以下是其核心用途及优势的详细解析&#xff1a; 一、开发环境快速搭建 一站式集成环境集成Apa…

Python搭建HTTP服务,如何用内网穿透快速远程访问?

Python的内置HTTP服务模块是开发者工具箱中的瑞士军刀&#xff0c;只需一行命令即可启动一个功能完备的Web服务器。无论是前端工程师调试页面、数据科学家共享Jupyter Notebook&#xff0c;还是后端开发者快速验证API原型&#xff0c;Python HTTP服务都能以零配置的方式满足需求…

拨号音识别系统的设计与实现

拨号音识别系统的设计与实现 摘要 本文设计并实现了一个完整的拨号音识别系统&#xff0c;该系统能够自动识别电话号码中的数字。系统基于双音多频(DTMF)技术原理&#xff0c;使用MATLAB开发&#xff0c;包含GUI界面展示处理过程和结果。系统支持从麦克风实时录音或加载音频文…

数据结构-树详解

树简介 树存储和组织具有层级结构的数据&#xff08;例&#xff1a;公司职级&#xff09;&#xff0c;就是一颗倒立生长的树。 属性&#xff1a; 递归n个节点有n-1个连接节点x的深度&#xff1a;节点x到根节点的最长路径节点x的高度&#xff1a;节点x到叶子节点的最长路径 …

【安卓Sensor框架-2】应用注册Sensor 流程

注册传感器的核心流程为如下&#xff1a;应用层调用 SensorManager注册传感器&#xff0c;framework层创建SensorEventQueue对象&#xff08;事件队列&#xff09;&#xff0c;通过JNI调用Native方法nativeEnableSensor()&#xff1b;SensorService服务端createEventQueue()创建…