二叉搜索树的第 k 大节点

1、参考资料

https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-di-kda-jie-dian-lcof/

2、题目描述

题目描述

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

示例 1:

输入: root = [3,1,4,null,2], k = 13/ \1   4\2
输出: 4

示例 2:

输入: root = [5,3,6,2,4,null,null,1], k = 35/ \3   6/ \2   4/1
输出: 4

限制:

1 ≤ k ≤ 二叉搜索树元素个数

3、代码思路

中序遍历的变种问题

  1. 二叉搜索树的性质:左节点的值不大于其父节点的值,右节点的值不小于其父节点的值,所以二叉搜索树的中序遍历为递增序列
  2. 问题是我们这道题求的是第 k 大的节点,即中序遍历的倒数第 k 个节点,这好办,我们中序遍历的时候先输出右节点,再输出父节点,最后输出左节点,这就变成了递减序列,所以求“二叉搜索树第 k 大的节点”可转化为求“此树的中序遍历倒序的第 k 个节点”
  3. 中序遍历就牵涉到递归,问题是参数 k 如何传递给递归函数 dfs() 呢?答案是不能将 k 通过参数传递给递归函数,因为递归的本质是触底反弹,在递归至最深层之后,开始回溯的时候,每我们才能处理 k,我们,至于何时当递归至最深层,我们并不知道,所以要么通过 dfs() 带上一个返回值来处理 k,要么就将 k 定义在函数的外部,直接通过成员变量的方式访问
  4. 首先,中序遍历时,先递归访问右子节点,再访问父节点,最后访问左子节点,访问父节点时,执行 k-1 操作,表示已经访问了一个节点
  5. 直到 k == 0 时,我们使用成员变量 res 记录第 k 大元素的值,然后使用 return 结束递归的执行

4、代码实现

代码

class Solution {int k;int res;public int kthLargest(TreeNode root, int k) {this.k = k;dfs(root);return this.res;}public void dfs(TreeNode curNode) {// 当前节点为空,开始回溯if (curNode == null) {return;}dfs(curNode.right); // 先递归访问右子节点// 访问父节点时,先将 k-1,表示已经访问过一个节点// 如果 k == 0 时,我们使用成员变量 res 记录第 k 大元素的值if (--k == 0) {res = curNode.val;return;}dfs(curNode.left); // 最后访问左子节点}
}public class TreeNode {int val;TreeNode left;TreeNode right;TreeNode(int x) {val = x;}
}

二叉搜索树的第 k 大节点相关推荐

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

    [LeetCode]剑指 Offer 54. 二叉搜索树的第k大节点 文章目录 [LeetCode]剑指 Offer 54. 二叉搜索树的第k大节点 一.中序遍历(提前返回) 一.中序遍历(提前返回) ...

  2. 二叉搜索树的第 k 大节点(递归,反中序遍历 + 提前返回)

    题意: 给定一棵二叉搜索树,请找出其中第k大的节点. 基于此性质:二叉搜索树的中序遍历为 递增序列 根据以上性质,易得二叉搜索树的 中序遍历倒序 为 递减序列 . 因此,求 "二叉搜索树第 ...

  3. [剑指offer]面试题第[54]题[JAVA][二叉搜索树的第k大节点][递归][迭代]

    [问题描述][简单] 给定一棵二叉搜索树,请找出其中第k大的节点.示例 1: 输入: root = [3,1,4,null,2], k = 13/ \1 4\2 输出: 4 示例 2:输入: root ...

  4. 剑指Offer - 面试题54. 二叉搜索树的第k大节点(二叉树循环遍历)

    1. 题目 给定一棵二叉搜索树,请找出其中第k大的节点. 示例 1: 输入: root = [3,1,4,null,2], k = 13/ \1 4\2 输出: 4示例 2: 输入: root = [ ...

  5. 【剑指offer】面试题54:二叉搜索树的第k大节点(java)

    给定一棵二叉搜索树,请找出其中第k大的节点. 示例 1: 输入: root = [3,1,4,null,2], k = 1    3   / \  1   4   \    2 输出: 4 示例 2: ...

  6. 54. 二叉搜索树的第k大节点

    2020-06-22 1.题目描述 给定一棵二叉搜索树,请找出其中第k大的节点. 2.题解 中序遍历二叉搜索树即为升序的结果,将其存储在vector中,最后进行输出即可. 3.代码 /*** Defi ...

  7. leetcode —— 面试题54. 二叉搜索树的第k大节点

    给定一棵二叉搜索树,请找出其中第k大的节点. 解法一:使用递归和中序遍历 # Definition for a binary tree node. # class TreeNode: # def __ ...

  8. 剑指offer面试题54. 二叉搜索树的第k大节点(逆中序遍历)

    题目描述 给定一棵二叉搜索树,请找出其中第k大的节点. 思路 详见链接 代码 class Solution:def kthLargest(self, root:TreeNode, k:int)-> ...

  9. 剑指offer | 面试题54:二叉搜索树的第k大节点

    转载本文章请标明作者和出处 本文出自<Darwin的程序空间> 本文题目和部分解题思路来源自<剑指offer>第二版 开始行动,你已经成功一半了,献给正在奋斗的我们 题目 给定 ...

最新文章

  1. 零基础Java学习之包(Package)
  2. spring-security-oauth2实现OAuth2.0服务
  3. 从零开始数据科学与机器学习算法-线性回归-02
  4. web前端自学入门视频教程分享
  5. 关于一类docker容器闪退问题定位
  6. Hadoop不同版本数据传输distcp问题设置
  7. Eclipse 编译StanfordNLP
  8. 信息管理学基础(第二版)马费成
  9. HEVC/H265编码原理
  10. npm run dev的实质
  11. ui设计现状与意义_对于ui设计行业来说,用户界面设计的发展现状是什么?
  12. 【Win】KMS 激活命令记录
  13. 创建Windows Phone内核模式驱动
  14. 重磅!百度多模态模型ERNIE-ViL刷新5项任务纪录,并登顶权威榜单VCR
  15. OUC2022秋季软件工程第16组第二周作业
  16. 用户显示图片的服务器是什么,显示服务器上的图片怎么写
  17. 【信息检索导论】第三章 容错式检索
  18. 年度大戏《“跨界”的诱惑》主演:头部车企、手机巨头
  19. 阿里巴巴Java开发手册(嵩山版)v1.7.0 及各个历史版本 百度云直接带走 不需要其他操作
  20. QSPI和SPI是什么关系,区别是什么?

热门文章

  1. 2021年中国一次性防护服市场趋势报告、技术动态创新及2027年市场预测
  2. 弹簧式止回阀行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  3. 下列描述中 哪些符合java语言的特征_coreJavaBasic试题带答案
  4. android 自定义progressdialog,android自定义ProgressDialog加载效果
  5. php a文件怎么继承b文件的类,php 如何将存在a文件中图片移到b文件中
  6. Unix网络编程卷一第三章笔记
  7. 30 万奖金悬赏 | CSDN 软件开发精英赛即日启动
  8. 腾讯回应两块八卖《鬼谷八荒》:已下架并退款;iMac Pro 售完即停产;iCloud 识别姓氏闹乌龙 | 极客头条...
  9. Semaphore 里面居然有这么一个大坑!
  10. 天呐,你竟然还在用 try–catch-finally