【LeetCode热题100】230. 二叉搜索树中第K小的元素(二叉树)

一.题目要求

给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 个最小元素(从 1 开始计数)。

二.题目难度

中等

三.输入样例

示例 1:
在这里插入图片描述
输入:root = [3,1,4,null,2], k = 1
输出:1

示例 2:
在这里插入图片描述
输入:root = [5,3,6,2,4,null,null,1], k = 3
输出:3

四.解题思路

踩坑了 千万记得传引用别传值

五.代码实现

class Solution {
public:
    int kthSmallest(TreeNode* root, int k) {

        int target = 1;
        return mid(root, k, target);

    }

    int mid(TreeNode* node, int k,int &target) {
        if(!node) 
            return value;

        mid(node->left, k, target);

        if(k == target)
            value = node->val; 
        target++;

        mid(node->right, k, target);

        return value;
    }
private:
    int value = -1;
};

六.题目总结

在C++中,将变量作为参数传递给函数时,默认情况下是通过值传递(pass-by-value)。这意味着函数接收参数值的副本,对这个副本所做的任何更改都不会影响原始变量。
当你在mid函数中递归调用自身,并试图通过增加target的值来跟踪当前节点在中序遍历中的位置时,你实际上是在每次递归调用中更改target副本的值。一旦递归调用返回,这个更改就会丢失,因为它只影响了传递给该递归调用的target的副本,而不是所有递归调用中共享的一个target变量。
底层原理
当函数被调用时,其参数(如果是基本数据类型,如int、double等)会被复制到调用函数的栈帧(stack frame)中。栈帧是存储函数调用信息(如参数、局部变量和返回地址)的数据结构,每个函数调用都有自己的栈帧。因此,如果你在一个函数调用中修改了一个基本数据类型的参数,你只是修改了它在当前栈帧中的副本,原始变量(在调用函数的栈帧中)不会被更改。

解决方案
要解决这个问题,有几个选项:

  • 使用引用传递(pass-by-reference):通过将target作为引用传递给递归函数,你可以确保所有递归调用都操作同一个变量,而不是它的副本。这样,任何对target的更改都会保留下来。
int mid(TreeNode* node, int k, int& target) {
    // 函数体保持不变
}
  • 返回并更新target:另一个选项是让mid函数返回当前的target值,并在每次递归调用后更新它。
int mid(TreeNode* node, int k, int target) {
    if(!node) 
        return target;

    target = mid(node->left, k, target);

    if(k == target)
        value = node->val; 
    target++;

    target = mid(node->right, k, target);

    return target;
}

使用类成员变量:虽然你已经尝试使用类成员变量value来存储结果,你也可以使用一个类成员变量来跟踪target的值。不过,这种方法可能需要更多的调整,以确保变量在每次kthSmallest函数调用之前被正确初始化。

通过以上任一解决方案,你可以确保target变量正确地跟踪中序遍历的进度,并且在递归过程中正确更新。

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

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

相关文章

newOJ 1099: 输油管道问题

目录 题目链接: 思路: 代码: 题目链接: P1099 - 输油管道问题 - New Online Judge (ecustacm.cn) 思路: 因为主输油管道是由东向西的, 而每口油井要有一条输油管道和主输油管道连接(或南或北…

[DDD] ValueObject的一种设计落地及应用

目录 前言一、ValueObject二、设计2.1 接口2.2 单一值ValueObject2.3 单一字符串ValueObject 三、实现3.1 示例3.1.1 PhoneNumber3.1.2 SocialCreditCode 四、使用4.1 异常处理4.2 Json 反/序列化4.2.1 请求体4.2.2 HTTP接口4.2.3 用例 4.3 JPA/MyBatis4.3.1 Converter或TypeHa…

Harmony(鸿蒙)Stage模型综述

设计思想 ​Stage模型的设计,是为了提供给开发者一个更好的开发方式,更好的适用于多设备、分布式场景。 ​Stage模型的设计思想如下图所示。 ​Stage模型的设计基于如下三个出发点: 应用进程的有序管理 随着设备的内存越来越大&#xff0…

SM4加密是什么?SM4算法在国密HTTPS协议中的作用

SM4加密算法是一种分组密码标准,由国家密码管理局于2012年3月21日发布,相关标准为“GM/T 0002-2012《SM4分组密码算法》,与国际上广泛使用的AES等算法类似,SM4同算法样用于保护数据的机密性,确保信息在传输过程中不被未…

罗德与施瓦茨 RS®FSV3000 信号与频谱分析仪

R&SFSV3000 信号与频谱分析仪 罗德与施瓦茨 R&SFSV3000 信号与频谱分析仪一键即可测量,可以通过基于事件的操作捕获信号,并使用 SCPI 记录器轻松编写脚本程序,从而快速设置复杂测量。分析仪还具有出色的测量速度,可实…

学习鸿蒙基础(8)

一、BuilderParam装饰器 当开发者创建了自定义组件,并想对该组件添加特定功能时,例如在自定义组件中添加一个点击跳转操作。若直接在组件内嵌入事件方法,将会导致所有引入该自定义组件的地方均增加了该功能。为解决此问题,ArkUI引…

关于「技术开发技能」课程

本课程分为三个部分,带您了解如何使用大模型平台、如何训练与部署大模型及生成式AI产品应用与开发,您将能了解各类服务的优势、功能、典型使用案例、技术概念和成本。 学习任选的两个课程模块,并通过测验者,将授予「技术开发技能…

【C++】哈希应用之布隆过滤器

👀樊梓慕:个人主页 🎥个人专栏:《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》《算法》 🌝每一个不曾起舞的日子,都是对生命的辜负 目录 前言 1.布隆过滤器的提出…

vue基础——java程序员版(vue路由)

1、引入路由 在控制台执行vue ui,在插件市场里可以找到vue-router并导入。 ​ 一般情况下,vue会自动在main,js中引入vue-router,如下: import Vue from vue import App from ./App.vue import ./plugins/element.js import rou…

springboot整合aop实现自定义注解-方法运行异常重试demo

1.依赖引入 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId> </dependency>2.自定义注解 import java.lang.annotation.ElementType; import java.lang.annotation.Retentio…

简易电路设计,PW1605芯片实现24V/30V/48V限流过压保护功能

一般描述 PW1605 是一款电流限制开关&#xff0c;具有可编程输入过压保护和输出电压箝位功能。集成保护 N 沟道 FET 具有极低的 RDS&#xff08;ON&#xff09; 功能&#xff0c;PW1605有助于降低正常工作期间的功率损耗。可编程软启动时间控制启动期间输出电压的压摆率。独立的…

【LV15 day14 中断处理:按键驱动程序编写】

一、什么是中断 一种硬件上的通知机制&#xff0c;用来通知CPU发生了某种需要立即处理的事件 分为&#xff1a; 内部中断 CPU执行程序的过程中&#xff0c;发生的一些硬件出错、运算出错事件&#xff08;如分母为0、溢出等等&#xff09;&#xff0c;不可屏蔽外部中断 外设发…

一、SpringBoot3 介绍

本章概要 SpringBoot3 简介系统要求快速入门入门总结 1.1 SpringBoot3 简介 此处使用 SpringBoot 版本&#xff1a;3.0.5 https://docs.spring.io/spring-boot/docs/current/reference/html/getting-started.html 无论使用XML、注解、Java配置类还是他们的混合用法&#xff0…

C语言学习--字符串和整型的转换

目录 整型→字符串 方法1&#xff1a;利用‘0’将单个数字转字符 方法2&#xff1a;利用sprintf函数 方法3&#xff1a;利用itoa函数 字符串→整型 方法1&#xff1a;利用-‘0’直接转换 方法2&#xff1a;利用atoi函数 整型→字符串 整形数据变成字符串&#xff0c;最…

数据结构从入门到精通——归并排序

归并排序 前言一、归并排序的基本思想二、归并排序的特性总结三、归并排序的动画展示四、递归实现归并排序的具体代码展示五、非递归实现归并排序 前言 归并排序是一种分治策略的排序算法。它将一个序列分为两个等长&#xff08;几乎等长&#xff09;的子序列&#xff0c;分别…

百度百科审核不通过全攻略,一看就会!

在撰写百度百科词条时&#xff0c;遇到审核不通过的情况可能会让人感到沮丧。然而&#xff0c;我们并不需要灰心&#xff0c;而是要通过一些方法来改善文章质量&#xff0c;使其符合百度百科的要求。腾轩科技传媒分享百度百科审核不通过全攻略&#xff0c;一看就会&#xff01;…

Docker Stack(堆栈) 部署多服务集群,多服务编排

1、Docker Stack简介 Docker Stack(堆栈) 是在 Swarm 上管理服务堆栈的工具。而在以前文章docker swarm集群搭建 介绍的 Docker Swarm 只能实现对单个服务的简单部署&#xff0c;于是就引出了Docker Stack。 上面我们介绍到 docker-compose&#xff1a;可以在一台机器上使用…

出差补助怎么发放更高效省心?这套攻略快看看

交补、餐补、话补等各类补助场景分散&#xff0c;无法实现一站式统筹管理。不仅如此&#xff0c;补贴核算也总是需要员工提供各类凭证&#xff0c;经过财务反复核实才能发放……出差发放补助原本是为了传递企业关怀&#xff0c;鼓励员工积极出差&#xff0c;由于发放和管理不当…

6 Spring-AOP

文章目录 1&#xff0c;AOP简介1.1 什么是AOP?1.2 AOP作用1.3 AOP核心概念 2&#xff0c;AOP入门案例2.1 需求分析2.2 思路分析2.3 环境准备2.4 AOP实现步骤步骤1:添加依赖步骤2:定义接口与实现类步骤3:定义通知类和通知步骤4:定义切入点步骤5:制作切面步骤6:将通知类配给容器…

新能源电车充电桩运营管理分析

摘要&#xff1a;近年来&#xff0c;我国大力推进新能源公共交通的发展&#xff0c;制定了一系列相关政策法规。作为公共充电设施的新能源充电桩也得到了发展和普及&#xff0c;其在新能源领域发挥着重要的保障作用。在当前&#xff0c;充电桩的管理还存在许多短板&#xff0c;…