二叉搜索树的第 k 大的节点

news2025/4/11 8:03:25

题目描述

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

在这里插入图片描述

解题基本知识

二叉搜索树(Binary Search Tree)又名二叉查找树、二叉排序树。它是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。

  • 解法一: 递归

    利用二叉搜索树的特性进行中序遍历。先遍历左节点,然后根节点,最后遍历右节点,得到的是一个递增序列,那么序列的倒序为递减序列。因此这道题我们可以转变为求二叉搜索树中序遍历倒序的第 k 个数。
    在这里插入图片描述

    /**
     * Definition for a binary tree node.
     * function TreeNode(val) {
     *     this.val = val;
     *     this.left = this.right = null;
     * }
     */
    /**
     * @param {TreeNode} root
     * @param {number} k
     * @return {number}
     */
    const kthLargest = (root, k) => {
      let res = null; // 初始化返回值
      // 因为需要倒序第 k 个,所以处理是右节点,根节点,然后左节点
      const dfs = (root) => {
        if (!root) return; // 如果当前节点为 null,本轮处理结束
        dfs(root.right); // 开始处理右节点
        if (k === 0) return; // k 值 为 0,代表已经处理的节点超过目标节点,本轮处理结束
        if (--k === 0) {
          // 当 k 值 减 1 为 0,表示已经到了我们想要的 k 大 节点,保存当前值
          res = root.val;
        }
        dfs(root.left); // 处理左节点
      };
      dfs(root); // 从初始化节点开始处理
      return res;
    };
    
    • 复杂度分析:
      • 时间复杂度 O(N):无论 k 的值大小,递归深度都为 N,占用 O(N) 时间。
      • 空间复杂度 O(N):无论 k 的值大小,递归深度都为 N,占用 O(N) 空间。
  • 解法二: 迭代
    思路还是二叉树的中序遍历,利用栈的方式进行遍历。
    在这里插入图片描述

    /**
     * Definition for a binary tree node.
     * function TreeNode(val) {
     *     this.val = val;
     *     this.left = this.right = null;
     * }
     */
    /**
     * @param {TreeNode} root
     * @param {number} k
     * @return {number}
     */
    var kthLargest = function (root, k) {
      if (!root) return 0;
      // 声明储存栈
      const stack = [];
      // 判断当前栈否有节点和当前遍历节点位置
      while (stack.length || root) {
        while (root) {
          // 往栈里添加当前节点,同时切换为右节点处理
          stack.push(root);
          root = root.right;
        }
        // 取出当前栈顶元素,根据添加的顺序,当前元素是栈内最大的
        const cur = stack.pop();
        k--;
        if (k === 0) return cur.val;
        // 切换为左节点处理
        root = cur.left;
      }
      return 0;
    };
    
    • 复杂度分析:
      • 时间复杂度 O(N):需要遍历整棵树一次,复杂度为 O(N)
      • 空间复杂度 O(N):需要额外空间栈进行储存树,复杂度为 O(N)

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

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

相关文章

C语言第九天笔记

数组的概念 什 么是数组 数组是 相同类型, 有序数据的集合。 数 组的特征 数组中的数据被称为数组的 元素,是同构的 数组中的元素存放在内存空间里 (char player_name[6]:申请在内存中开辟6块连续的基于char类 型的变量空间) 衍生概念&…

数据安全、信息安全、网络安全区别与联系

关键字: 信息安全 数据安全 网络安全 [导读] 让人更好理解 “数据安全”、“信息安全”、“网络安全” 三者间的区别与联系了,我们汇总了官方机构给这三者的定义,并且网友也给出了自己的看法,一起来看看。 在 “互联网 ” 被广…

tomcat10环境的搭建及发布一个动态服务

Day 15 # 构建项目 [rootstatic-server eleme_web]# npm run build # 将静态的项目移动到nginx [rootstatic-server eleme_web]# ls [rootstatic-server eleme_web]# ls dist/ css favicon.ico index.html js [rootstatic-server eleme_web]# vim dist/index.html [r…

数据虚拟化和传统数据集成方式(如 ETL)有何区别?

要理解数据虚拟化,我们先说一下什么是虚拟化(Virtualization)? 所谓虚拟化(Virtualization),通常指的是对 IT 资源的抽象,它屏蔽了这些资源的物理性质和边界。IT 资源可以是服务器、…

DjangoRF-11-创建testcases子应用--任务模块

这里先写任务应用,再写套件,然后写接口,最后再写请求, 这个是新的应用,要创建子应用,然后添加到settings的注册里面 1、和往常一样先写模型,序列化,权限,视图&#xf…

【正版软件分享】FastCopy Pro:Windows 文件复制的加速器,让数据传输更高效

在数字化时代,数据的快速、安全传输是每个用户和企业的核心需求。今天,我们将深入探讨一款名为 FastCopy Pro 的 Windows 文件复制、备份和删除软件,它以其卓越的性能和易用性在众多工具中脱颖而出。 FastCopy Pro 简介 FastCopy Pro 是一款…

jetbrain插件市场无法下载插件/idea插件install无效

最近把电脑重装了一次系统,发现idea插件市场可以搜到插件,但是不显示overview之类的信息,点install也没反应。 于是打算直接到插件市场的官网plugins.jetbrains.com下载插件安装。 结果发现同样可以搜索到插件,但是无法下载。 在…

多地气温连创新高,快递小哥高温补贴有多少

被热浪笼罩的多个城市,再度进入“烧烤模式”。朋友圈都在被同一句话刷屏——“我和烤肉之间只差一撮孜然的距离”。 在如此炎热时,快递小哥们依旧头顶烈日,穿梭在城市的车水马龙和摩天大楼之间,电话不离耳、腿脚不停歇&#xff0…

LLaMA-Factory私有化部署 -- PAI-DSW

LLaMA-Factory是一款比较流行的大语言模型微调框架。本文主要记录在阿里云人工智能平台PAI的DSW实例中部署LLaMA-Factory的过程,主要参考的教程是B站视频LLaMA-Factory私有化部署。 LLaMA-Factory的私有化部署与部署大模型的过程大体相同,都包括创建Pyt…

培训第十九天(安装nginx代理tomcat)

上午 1、构建vue发行版本 [rootserver ~]# cd eleme_web/[rootserver eleme_web]# npm run buid //项目未执行时运行该命令,创建发行版本 [rootserver eleme_web]# cd dist/ //dist中包含发行版本的所有文件[rootserver dist]# lscss favicon.ico img in…

git创建远程仓库

注册 请自行注册github账号 创建远程仓库 自己在上图那里可以创建一个远程仓库 克隆远程仓库 我们需要将远程仓库克隆到本地之后,在本地修改最后上传到远程仓库,关系如下: 由于我们的仓库是私密仓库,需要通过ssh密钥的方法才…

day19(安装nginx代理 + tomcat)

1、构建vue发行版本 [rootserver ~]# cd eleme_web/ [rootserver eleme_web]# npm run buid //项目未执行时运行该命令,创建发行版本 [rootserver eleme_web]# cd dist/ //dist中包含发行版本的所有文件 [rootserver dist]# ls css favicon.ico img index…

⌈ 传知代码 ⌋ 基于矩阵乘积态的生成模型

💛前情提要💛 本文是传知代码平台中的相关前沿知识与技术的分享~ 接下来我们即将进入一个全新的空间,对技术有一个全新的视角~ 本文所涉及所有资源均在传知代码平台可获取 以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦&#x…

SQL语句分类;查看MySQL存储引擎

文章目录 SQL语句分类查看MySQL存储引擎存储引擎对比 SQL语句分类 数据本身权限:定义 修改 DDL【data definition language】 数据定义语言,用来维护存储数据的结构 代表指令: create, drop, alterDML【data manipulation language】 数据操纵语言&…

第十九天内容

上午 1、构建vue发行版本 2、java环境配置 jdk软件包路径: https://download.oracle.com/java/22/latest/jdk-22_linux-x64_bin.tar.gz 下午 1、安装tomcat软件 tomcat软件包路径: https://dlcdn.apache.org/tomcat/tomcat-10/v10.1.26/bin/apache-to…

水库大坝安全自动监测系统位移测点布设

水库大坝安全自动监测系统中的位移测点布设是大坝安全监测的重要环节,其目的是为了及时、准确地获取大坝的位移信息,评估大坝的稳定性,确保大坝的安全运行。位移测点的布设需要综合考虑大坝的结构特点、地质条件、运行工况及监测需求等多方面…

tomcat多实例配置-Linux(CentOS)

多实例配置 一、安装 tomcat二、多实例配置 tomcat 官网 tomcat 安装包下载地址 一、安装 tomcat 解压tomcat压缩包到 /usr/local 下 tar xf apache-tomcat-*.gz -C /usr/local/# 可选 添加一个软链接,方便查找 ln -s /usr/local/apache-tomcat-* /usr/local/tom…

python实现发票信息识别和处理

公司需要发票报销,一定周期的发票攒在一起,处理报销单特别繁琐,遂萌生用python简化报销流程。 明确需求 公司报销单需要发票代码(短码),金额,总计金额,如下图 开始编码 首先需要一个读取pdf的类库 pdf…

AEAD:AES-CCM简介

目录 1. CCM模式 2.认证加密过程 3.校验解密过程 1. CCM模式 CCM(Counter with CBC-MAC) 首先使用 CBC-MAC 来保证数据完整性和真实性,然后使用 CTR 模式来保证数据机密性。 在CCM中,受保护的数据被称为payload,简…

虚拟机(CentOS7)安装gitlab

GitLab官方安装教程 链接:https://gitlab.cn/install/ 1、关闭虚拟机防火墙 # 关闭防火墙命令 systemctl stop firewalld # 查看当前防火墙的状态信息 systemctl status firewalld成功关闭 2、GitLab安装包下载 # windows下载地址: https://mirrors.t…