leetcode669. 修剪二叉搜索树

1.错误思路;

我原来的思路是前序遍历

    void dfs(TreeNode* root,TreeNode* node,int low,int high){
        if(node){

            if(node->val<low||node->val>high){
                remove(root,node->val);
                
            }
            dfs(root,node->left,low,high);
            dfs(root,node->right,low,high);
        }
    }

挨个删除不符合low和high之间的元素,后面发现一个重大的bug是在遍历的时候删除元素,就是存在delete指针之后又再次访问原有内存空间的der B行为,然后把代码又改成

    void dfs(TreeNode* root,TreeNode* node,int low,int high){
        if(node){

            if(node->val<low||node->val>high){
                v.push_back(node);
            }
            dfs(root,node->left,low,high);
            dfs(root,node->right,low,high);
        }
    }

虽然理论上,可以行得通,但是后面发现这个样例输入无法通过
在这里插入图片描述

,后面发现直接remove函数里面如果加上了delete函数,就问题更大!
在这里插入图片描述
经过分析,认为原因依旧是出在原有删除算法上的问题,我这个原来的算法代码如下

class Solution {
public:
    vector<TreeNode*> v;
    TreeNode* trimBST(TreeNode* root, int low, int high) {
        dfs(root, root, low, high);
        for (const auto& i : v) {
            remove(root, i->val);
        }
        return root;
    }

    void dfs(TreeNode* root, TreeNode* node, int low, int high) {
        if (node) {
            if (node->val < low || node->val > high) {
                v.push_back(node);
            }
            dfs(root, node->left, low, high);
            dfs(root, node->right, low, high);
        }
    }

    void remove(TreeNode*& node, int key) {
        if (!node) {
            return;
        }
        if (node->val < key) {
            remove(node->right, key);
        } else if (node->val > key) {
            remove(node->left, key);
        } else if (node->left && node->right) {
            TreeNode* iter = node->right;
            while (iter->left) {
                iter = iter->left;
            }
            node->val = iter->val;
            remove(node->right, node->val);
        } else {
            TreeNode* tmp = node;
            node = node->left ? node->left : node->right;
            delete tmp; // 将节点标记为需要删除,但不实际删除
        }
    }
};

问题依旧可能存在记录了待删除的指针,但是实际上挨个删除节点值得时候,采用懒惰删除,直接覆盖的方式,实际上没有改动指针的指向,因此仍然存在delete相应内存之后仍然访问原有内存的情况,因此出现内存段错误!
因此我的算法到此彻底破产BBQ了,只能直接抄答案抄题解了!

2.题解思路

思路:
根据BST特性,如果当前节点node的值小于low,则包括所有节点在内的所有左子树,必然不符合要求,同样的,如果当前节点node的值大于high,那么包括node在内的所有右子树必然都不符合要求,因此直接排除出去。最后递归只保留合适的元素。
本题带给我的启示非常大!一定不要边删除边遍历元素,容易出现段错误!
如果非要采用我原有的思路,可以再研究一下代码随想录的BST里面删除节点的代码算法!
后面发现代码随想录的代码也沦陷了,我的这个算法确实行不通了!只有题解的算法靠谱!

class Solution {
public:
    vector<TreeNode*> v;
    TreeNode* trimBST(TreeNode* root, int low, int high) {
        if(!root){
            return nullptr;
        }
        if(root->val<low){
            return trimBST(root->right,low,high);
        }
        if(root->val>high){
            return trimBST(root->left,low,high);
        }
        if(root->val<=high&&root->val>=low){
            root->left=trimBST(root->left,low,high);
            root->right=trimBST(root->right,low,high);
            return root;
        }
        return root;
    }
    
    
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

奥比中光深度相机(一):环境配置

文章目录 奥比中光深度相机&#xff08;一&#xff09;&#xff1a;环境配置简介电脑环境SDK配置步骤安装环境依赖填写路径&#xff0c;点击Configure选择Visual studio点击Generate完成基于Python的SDK配置方法一&#xff1a;使用Cmake直接打开方法二&#xff1a;通过源文件打…

代码随想录算法训练营DAY7| C++哈希表Part.2|LeetCode:454.四数相加II、383.赎金信、15. 三数之和、18.四数之和

文章目录 454.四数相加II思路C代码 383.赎金信C 代码 15. 三数之和排序哈希法思路C代码 排序双指针法思路去重C代码 18.四数之和前言剪枝C代码 454.四数相加II 力扣题目链接 文章链接&#xff1a;454.四数相加II 视频链接&#xff1a;学透哈希表&#xff0c;map使用有技巧&…

3D开发工具HOOPS更新:高效、轻量化模型处理再突破!

随着数字化转型的深入发展&#xff0c;高性能图形显示成为了软件开发领域的重要研究方向。在众多工具和库中&#xff0c;HOOPS因其强大的三维图形处理能力而受到广泛关注。 HOOPS也与时俱进&#xff0c;持续更进与创新&#xff0c;近期又推出了一系列新功能&#xff0c;这些功…

Qt篇——Qt无法翻译tr()里面的字符串

最近遇到使用Qt语言家翻译功能时&#xff0c;ui界面中的中文都能够翻译成英文&#xff0c;但是tr("测试")这种动态设置给控件的中文&#xff0c;无法翻译&#xff08;lang_English.ts文件中的翻译已经正确添加了tr()字符串的翻译&#xff09;。 上网搜了很多资料&am…

STM32学习笔记(7_1)- ADC模数转换器

无人问津也好&#xff0c;技不如人也罢&#xff0c;都应静下心来&#xff0c;去做该做的事。 最近在学STM32&#xff0c;所以也开贴记录一下主要内容&#xff0c;省的过目即忘。视频教程为江科大&#xff08;改名江协科技&#xff09;&#xff0c;网站jiangxiekeji.com 本期开…

23届嵌入式被裁,有什么好的就业建议?

最近看到了一个提问&#xff0c;原话如下&#xff1a; 本人23届毕业生&#xff0c;就业方向嵌入式软件&#xff0c;坐标深圳&#xff0c;工作3月公司裁员&#xff0c;目前接近12月开始找工作。 boss上投递简历&#xff0c;校招岗&#xff0c;比较有规模的好公司基本已读不回&am…

PCL拟合并绘制平面(二)

使用RANSAC拟合点云平面 1、C实现2、效果图 普通的点云平面拟合方式在一般情况下可以得到较好的平面拟合效果&#xff0c;但是容易出现平面拟合错误或是拟合的平面不是最优的情况。此时就需要根据自己的实际使用情况&#xff0c;调整平面拟合的迭代次数以及收敛条件。 使用RAN…

PHPCMS v9城市分站插件

PHPCMS自带的有多站点功能&#xff0c;但是用过的朋友都知道&#xff0c;自带的多站点功能有很多的不方便之处&#xff0c;例如站点栏目没法公用&#xff0c;每个站点都需要创建模型、每个站点都需要单独添加内容&#xff0c;还有站点必须静态化。如果你内容很多这些功能当然无…

智慧公厕,运用大数据提升公共厕所管理水平

在现代社会&#xff0c;科技的发展给我们带来了诸多便利&#xff0c;而智慧公厕就是其中之一。智慧公厕运用数据和技术&#xff0c;提升公共厕所的管理水平&#xff0c;为社会生活服务。本文将以智慧公厕源头实力厂家广州中期科技有限公司&#xff0c;遍布全国的众多标杆性案例…

数据结构-----栈、顺序栈、链栈

在软件应用中&#xff0c;栈这种后进先出数据结构的应用是非常普遍的。比如用浏览器上网时&#xff0c;不管什么浏览器都有一个“后退”键&#xff0c;你点击后可以按访问顺序的逆序加载浏览过的网页。即使从一个网页开始&#xff0c;连续点了几十个链接跳转&#xff0c;你点“…

Vtk裁剪功能之平面裁剪vtkClipClosedSurface(vtk小记)

1.原理分析 对你的三维图形&#xff0c;使用一个平面切下去&#xff0c;然后保留一半。 确定一个平面&#xff1a;使用法向量和一个三维坐标点可以确定一个平面 原始图像 切一刀 切两刀&#xff0c;又一半 切三刀&#xff0c;又一半 源代码 #include <vtkActor.h> #i…

医院同步时钟系统的耐用性与可靠性

医院同步时钟系统的耐用性与可靠性是医疗机构管理中至关重要的一环。随着医疗技术的不断发展和医院服务水平的提升&#xff0c;同步时钟系统在医院中的作用也变得愈发重要。在医院环境中&#xff0c;时间的准确性对于医疗过程中的各个环节都至关重要&#xff0c;从手术安排到用…

Python基础教程:轻松入门

基础 注释 #这是单行注释 这是多行注释&#xff0c;使用单引号。 这是多行注释&#xff0c;使用单引号。 这是多行注释&#xff0c;使用单引号。 """ 这是多行注释&#xff0c;使用双引号。 这是多行注释&#xff0c;使用双引号。 这是多行注释&#xff0c;使…

手把手教你 - JMeter压力测试

前言 压力测试是每一个Web应用程序上线之前都需要做的一个测试&#xff0c;他可以帮助我们发现系统中的瓶颈问题&#xff0c;减少发布到生产环境后出问题的几率&#xff1b;预估系统的承载能力&#xff0c;使我们能根据其做出一些应对措施。所以压力测试是一个非常重要的步骤&…

YOLOv9改进策略:注意力机制 | 动态稀疏注意力的双层路由方法BiLevelRoutingAttention | CVPR2023

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文改进内容&#xff1a; CVPR2023 动态稀疏注意力的双层路由方法BiLevelRoutingAttention&#xff0c;强烈推荐&#xff0c;涨点很不错&#xff0c;同时被各个领域的魔改次数甚多&#xff0c;侧面验证了性能。 &#x1f4a1;&#x1…

html2canvas 请求阿里云oss图片跨域问题解决

1. html2canvas设置 useCORS:true html2canvas(this.$refs.qrcode, {useCORS:true,}).then(canvas > {// 转成图片&#xff0c;生成图片地址let oImg new Image()oImg canvas.toDataURL(image/png) // 导出图片var oA document.createElement("a")oA.download…

大模型落地实战指南:从选择到训练,深度解析显卡选型、模型训练技、模型选择巧及AI未来展望—打造AI应用新篇章

0.前言大模型发展史 早期阶段&#xff08;1950s~1980s&#xff09; 在1950年代初期&#xff0c;人们开始尝试使用计算机处理自然语言文本。然而&#xff0c;由于当时的计算机处理能力非常有限&#xff0c;很难处理自然语言中的复杂语法和语义。随着技术的发展&#xff0c;自然…

Codeup_1132:问题 A: 最长公共子序列

目录 Problem DescriptionInputOutputSample InputSample Output原题链接解题思路代码实现&#xff08;C&#xff09; Problem Description 给你一个序列X和另一个序列Z&#xff0c;当Z中的所有元素都在X中存在&#xff0c;并且在X中的下标顺序是严格递增的&#xff0c;那么就…

2024游泳耳机哪个牌子好?分析测评四大热门游泳耳机

随着科技的不断发展&#xff0c;游泳耳机已经成为游泳爱好者们在水中畅游时的最佳伴侣。近年来游泳耳机市场涌现出了众多品牌和产品&#xff0c;让人眼花缭乱。为了帮助大家挑选到最适合自己的游泳耳机&#xff0c;我们特意对市面上四大热门游泳耳机进行了详细的分析测评&#…

Linux 系统Centos7.0记录安装Docker和安装jdk环境完整教程(建议收藏备用)

Linux 系统Centos7.0记录安装Docker和安装jdk环境完整教程&#xff08;建议收藏备用&#xff09; 一、安装前准备工作 1.1 查看服务器系统版本以及内核版本 cat /etc/redhat-release1.2 查看服务器内核版本 uname -r这里我们使用的是CentOS 7.9 系统&#xff0c;内核版本为…