二叉搜索树第大K节点,剑指offer,力扣

news2024/9/30 13:21:55

目录

题目地址:

题目:

我们直接看题解吧:

解题方法:

难度分析:

审题目+事例+提示:

解题分析:

解题思路:

代码实现:

代码补充:

代码实现(非递归) :


题目地址:

LCR 174. 寻找二叉搜索树中的目标节点 - 力扣(LeetCode)

难度:简单

今天刷寻找二叉搜索树第大K节点,大家有兴趣可以点上看看题目要求,试着做一下。

题目:

剑指 Offer 54. 二叉搜索树的第k大节点

给定一棵二叉搜索树,请找出其中第 k 大的节点的值。

我们直接看题解吧:

解题方法:

利用递归+中序遍历方法

难度分析:

主要考察二叉搜索树性质与中序遍历特点

审题目+事例+提示:

题目中序列是以二叉搜索树方式存储

解题分析:

二叉搜索树的中序遍历为 递增序列 ,根据此性质,易得二叉搜索树的 中序遍历倒序 为 递减序列 。

因此,求 “二叉搜索树第 cnt大的节点” 可转化为求 “此树的中序遍历倒序的第 cnt个节点”。

中序遍历 为 “、根、 顺序,递归法代码如下:

// 打印中序遍历
void dfs(TreeNode root) {
    if(root == null) return;
    dfs(root.left); // 左
    System.out.println(root.val); // 根
    dfs(root.right); // 右
}

中序遍历的倒序 为 “右、根、 顺序,递归法代码如下:

// 打印中序遍历倒序
void dfs(TreeNode root) {
    if(root == null) return;
    dfs(root.right); // 右
    System.out.println(root.val); // 根
    dfs(root.left); // 左
}

参考题解:LCR 174. 寻找二叉搜索树中的目标节点 - 力扣(LeetCode)

解题思路:

为求第 k个节点,需要实现以下 三项工作 :

      ·递归遍历时计数,统计当前节点的序号;
     · 递归到第 cnt 个节点时,应记录结果 res ;
      ·记录结果后,后续的遍历即失去意义,应提前终止(即返回)。

 递归解析:

       终止条件: 当节点 root 为空(越过叶节点),则直接返回;
       递归右子树: 即 dfs(root.right);
      三项工作:
            提前返回: 若 cnt=0,代表已找到目标节点,无需继续遍历,因此直接返回;
            统计序号: 执行 cnt=cnt−1 (即从 cnt 减至 0 );
            记录结果: 若 cnt=0,代表当前节点为第 cnt大的节点,因此记录 res=root.val;
      递归左子树: 即 dfs(root.left) ;

 

代码实现:

class Solution {
    int res, count;//由于下面形参cnt不能随着dfs的迭代而不断变化,
                 //因此为了记录迭代进程和结果,引入类变量count和res
    public int findTargetNode(TreeNode root, int cnt) {
        count = cnt;//将形参值cnt对类变量count进行初始化
        dfs(root);//这里不需要引入形参cnt,dfs中直接使用的是初始值为cnt的类变量count
        return res;
    }
    void dfs(TreeNode root) {
        if(root == null) return;//当root为空,终止递归
        dfs(root.right);
        if(cnt == 0) return;//当count=0即找到目标res,终止递归
        if(--count==0){//先--,再判断
            res = root.val;
            return;//这里的return可以避免之后的无效迭代dfs(root.left);
        }
        dfs(root.left);
    }
}

代码补充:

1、

题目指出:1≤cnt≤N(二叉搜索树节点个数);因此无需考虑 cnt>Nc 的情况。
若考虑,可以在中序遍历完成后判断 cnt>0 是否成立,若成立则说明 cnt>N 。

2、

count==0的判断条件是否可以并到第一个if(root==null)中?

count==0得放在--count之前才有效,回溯的过程可能会继续--,导致count<0,并没有起到剪枝效果,打印下count的值你就发现了

代码实现(非递归) :

class Solution { 
    public int findTargetNode(TreeNode root, int cnt) {
          // reverse-inorder (逆向中序排序 找到需要的第cut个就好了)
        LinkedList<TreeNode> stack = new LinkedList<>();
        TreeNode node = root;
        int count = 0;
        while(node != null || !stack.isEmpty()){
            if (node != null){
                stack.push(node);
                node = node.right;
            }else{
                // 说明是空了向左边走
                TreeNode pop = stack.pop();
                count++;
                if(count == cnt){
                    return pop.val;
                }
                node = pop.left;
            }
        }
        // 这里其实是没有必要的 但是必须要返回值
        return -1;
    }
}

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

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

相关文章

20倍压缩比!微软提出大模型提示压缩框架LLMLingua

近期&#xff0c;越来越多研究在探索大型语言模型&#xff08;LLM&#xff09;在实际应用中的推理和生成能力。随着 ChatGPT 等模型的广泛研究与应用&#xff0c;如何在保留关键信息的同时&#xff0c;压缩较长的提示成为当前大模型研究的问题之一。 为了加速模型推理并降低成本…

ViewBinding与DataBinding(视图绑定与数据双向绑定)

前言&#xff1a;心中纵是有所盼 严寒没有减 风很冷 我的手已渐蓝 前言 控件查找对于Android开发来说也是一部血泪史&#xff0c;一直为更有效的方案进行了多种方案的研究和探讨。findViewById() 过于繁琐&#xff0c;强制转换不安全&#xff1b;butterkniife 会存在众多臃肿的…

【【UART 传输数据实验】】

UART 传输数据实验 通信方式在日常的应用中一般分为串行通信&#xff08;serial communication&#xff09;和并行通信&#xff08;parallel communication&#xff09;。 我们再来了解下串行通信的特点。串行通信是指数据在一条数据线上&#xff0c;一比特接一比特地按顺序传…

随笔记录-springboot_LoggingApplicationListener+LogbackLoggingSystem

环境&#xff1a;springboot-2.3.1 加载日志监听器初始化日志框架 SpringApplication#prepareEnvironment SpringApplicationRunListeners#environmentPrepared EventPublishingRunListener#environmentPrepared SimpleApplicationEventMulticaster#multicastEvent(Applicati…

字符设备驱动的加载与卸载

一. 简介 前面几篇文章编写了 字符设备驱动模块加载与卸载框架代码&#xff0c;设置了开发板启动方式。文章地址如下&#xff1a; 字符设备驱动框架的编写-CSDN博客 字符设备驱动模块的编译-CSDN博客 字符设备驱动的加载与卸载前工作-CSDN博客 本文学习如何加载与卸载驱动…

windows10 固定电脑IP地址操作说明

windows10 固定电脑IP地址操作说明 一、无线网络的IP地址设置方法二、有线网络的IP地址设置方法 本文主要介绍&#xff0c;windows10操作系统下&#xff0c;不同的网络类型&#xff0c;对应的电脑IP地址设置方法。 一、无线网络的IP地址设置方法 在桌面右下角&#xff0c;点击…

st.pp.normalize_total(data) # NOTE: no log1p

这段代码在使用 stlearn 包中的 st.pp.normalize_total 函数对数据进行总体计数标准化。标准化后&#xff0c;每个细胞的总计数都将等于 median(total_counts)。 NOTE: no log1p 这行注释表示在标准化后&#xff0c;数据不会进行 log1p 转换。log1p 转换将每个计数值增加 1&a…

Java如何创建线程?到底有几种方式创建线程?

文章目录 继承Thread类实现Runnable接口实现Callable接口匿名内部类形式的线程创建实现接口 VS 继承Thread到底有几种创建线程的方式&#xff1f;参考 继承Thread类 定义一个线程类&#xff0c;重写实现run方法(因为 Thread类也实现了 Runable接口)&#xff0c;在其中定义线程…

Pytorch神经网络的参数管理

目录 一、参数访问 1、目标参数 2、一次性访问所有参数 3、从嵌套块收集参数 二、参数初始化 1、内置初始化 2、自定义初始化 3、参数绑定 在选择了架构并设置了超参数后&#xff0c;我们就进入了训练阶段。此时&#xff0c;我们的目标是找到使损失函数最小化的模型参数…

矩阵式键盘实现的电子密码锁

#include<reg51.h> //包含51单片机寄存器定义的头文件 sbit P14P1^4; //将P14位定义为P1.4引脚 sbit P15P1^5; //将P15位定义为P1.5引脚 sbit P16P1^6; //将P16位定义为P1.6引脚 sbit P17P1^7; //将P17位定义为P1.7引脚 sbit soundP3^7; //将so…

新媒体宣传与广州迅腾文化传播有限公司:品牌知名度提升的新动力

新媒体宣传与广州迅腾文化传播有限公司&#xff1a;品牌知名度提升的新动力 随着科技的飞速发展和互联网的普及&#xff0c;新媒体已经成为现代社会不可或缺的一部分。新媒体平台具有传播速度快、覆盖面广的特点&#xff0c;为企业品牌宣传提供了前所未有的机会。广州迅腾文化…

黑马点评07 秒杀优化 加阻塞队列

实战篇-22.秒杀优化-异步秒杀思路_哔哩哔哩_bilibili 1.流程回顾 1.1超卖问题 判断秒杀时间&#xff0c;加乐观锁&#xff08;比较标记/版本&#xff09;&#xff0c;检查库存是否大于0 1.2一人一单问题 看看数据库里有没有这个这个人下的订单&#xff1a; 1.单机模式中…

自动化测试 (五) 读写64位操作系统的注册表

自动化测试经常需要修改注册表 很多系统的设置&#xff08;比如&#xff1a;IE的设置&#xff09;都是存在注册表中。 桌面应用程序的设置也是存在注册表中。 所以做自动化测试的时候&#xff0c;经常需要去修改注册表 Windows注册表简介 注册表编辑器在 C:\Windows\regedit…

第二百一十五回 如何创建单例模式

文章目录 1. 概念介绍2. 思路与方法2.1 实现思路2.2 实现方法 3. 示例代码4. 内容总结 我们在上一章回中介绍了"分享三个使用TextField的细节"沉浸式状态样相关的内容&#xff0c;本章回中将介绍 如何创建单例模式.闲话休提&#xff0c;让我们一起Talk Flutter吧。 …

@KafkaListener 注解配置多个 topic

见如下示例 主要见 KafkaListener 中 topics 属性的配置 其中 ${xxxx.topic1} 为从springBoot 配置文件中读取的属性值 KafkaListener(topics {"${xxxx.topic1}", "${xxxx.topic2}"}, groupId "${xxxx.groupId}",containerFactory "xxx…

易点易动打通OA系统,实现固定资产高效管理

近年来,随着信息化建设的不断深入,OA系统在企业管理工作中的应用也日趋广泛。传统的固定资产管理存在数据分散,管理效率低等问题。深度整合易点易动和OA系统,可以打通各系统之间的数据通道,实现固定资产通过OA系统的全流程管理。这不仅可以提升管理效率,减轻人工管理成本,也更方…

部署LVS的NAT模式

实验准备 #负载调度器# 192.168.116.40 #内网 12.0.0.100 #外网 先添加双网卡 #web服务器# 192.168.116.20 #web1 192.168.116.30 #web2 #nfs共享服务# 192.168.116.10 #nfs systemctl stop firewalld setenforce 0 1.nfs共享文件 1…

Python-Selenium-使用 pywinauto 实现 Input 上传文件

当前环境&#xff1a;Win10 Python3.7 pywinauto0.6.8&#xff0c;selenium3.14.1 示例代码 from pywinauto import Desktop import osapp Desktop() dialog app[打开] dialog[Edit].set_edit_text(os.getcwd() .\\example-01.jpg) dialog[Button].click() 其他方法&…

接口测试的工具(3)----postman+node.js+newman

1.安装newman&#xff1a;输入命令之后 一定注意 什么都不要操作 静静的等待结束就行了。 2.安装失败的对此尝试不行 在用下面的方法 解压一下就行了 3.验证是否成功 多次尝试是可以在线安装成功的

SpringCloudAliBaba篇之Seata:分布式事务组件理论与实践

1、事务简介 事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。在关系数据库中&#xff0c;一个事务由一组SQL语句组成&#xff0c;事务具有4个属性&#xff1a;原子性、一致性、隔离性、持久性。这四个属性通常称为ACID原则。 原子性(atomici…