leetcode 剑指 Offer 54. 二叉搜索树的第k大节点_leetcode 二叉搜索树的第k大节点-程序员宅基地

技术标签: 剑指offer  

题目要求

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

解题思路

利用性质迭代

利用性质:二叉搜索树的中序遍历是递减的,因此二叉搜索树中序遍历的倒序是递增的。

二叉树的中序遍历:

recursive(root.left)
print(root.val)
recursive(root.right)

此外:

  1. 每当遍历到root的时候,k要减1。
  2. k == 0时,将root.val作为结果存储。
  3. k == 0时,停止迭代。
# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
    def kthLargest(self, root, k):
        """
        :type root: TreeNode
        :type k: int
        :rtype: int
        """
        def recursive(root):
            # 若根节点为空,则停止本次迭代。
            if not root:
                return
            # 先右节点。
            recursive(root.right)
            # 若self.k等于0,则提前终止迭代。
            if self.k <= 0:
                return
            # 到root节点时,执行k减1的操作,且当self.k为0时,证明找到第k大的数了,记录之。
            self.k -= 1
            if self.k == 0:
                self.res =  root.val
            # 再左节点。
            recursive(root.left)

        self.k = k
        recursive(root)

        return self.res

知识点

  1. python类中的__init__,是每次Class被实例化就会自动执行一次。
  2. self.name可以在类内被任意调用。本题中的,self.k和self.res也是如此。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_40317204/article/details/114539257

智能推荐

安装luarocks过程_apisix luarcoks-程序员宅基地

文章浏览阅读1k次,点赞2次,收藏2次。找到安装包https://github.com/luarocks/luarocks/wiki/Installation-instructions-for-Windows(附有安装说明,但是看不懂)尝试这个方法(看不懂)https://blog.csdn.net/mengzhisuoliu/article/details/52245964第二个完整的方法https://blog...._apisix luarcoks

【人工智能平台实践】华为Atlas200dk之黑白照片上色_华为atlas 200 dk-程序员宅基地

文章浏览阅读436次。这是我们的课程设计项目,前面走了很多弯路,说不定未来有同学也要做这个,所以记录一下。首先大致描述一下项目流程,然后主要详细记录了环境搭建和硬件连接的步骤,最后附上了实验报告的部分详细内容(ATC模型转换详细讲解)。_华为atlas 200 dk

Linux内存管理:(十二)Linux 5.0内核新增的反碎片优化_linux内存分配水位-程序员宅基地

文章浏览阅读1.1k次,点赞26次,收藏22次。文章说明:Linux内核版本:5.0架构:ARM64参考资料及图片来源:《奔跑吧Linux内核》_linux内存分配水位

HDU-1828 Picture(扫描线 求矩形并的周长)-程序员宅基地

文章浏览阅读144次。http://acm.hdu.edu.cn/showproblem.php?pid=1828Time Limit: 6000/2000 MS (Java/Others)Memory Limit: 32768/32768 K (Java/Others)Problem DescriptionA number of rectangular posters, photogra..._k - picture(扫描线)

结构化伪类选择器_结构化伪类选择器有哪些-程序员宅基地

文章浏览阅读1w次,点赞9次,收藏45次。1.:root选择器 :root选择器用于匹配文档根元素,在HTML中,根元素始终是html元素。也就是说使用“:root选择器”定义的样式,对所有页面元素都生效。对于不需要该样式的元素,可以单独设置样式进行覆盖。&lt;!doctype html&gt;&lt;html&gt;&lt;head&gt;&lt;meta charset="utf-8"&gt;&lt;titl..._结构化伪类选择器有哪些

查看 CUDA cudnn 版本 查看Navicat GPU版本_查看nvicc-程序员宅基地

文章浏览阅读406次。用于记录写小东西。 查看 CUDA cudnn 版本cuda 版本 cat /usr/local/cuda/version.txtcudnn 版本 cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 212345查看Navicat GPU版本nvidia-smi//10s显示一次watch -n 10 nvidia-smi..._查看nvicc

随便推点

如何检查CentOS版本:8种方法_查看centos版本-程序员宅基地

文章浏览阅读8.7k次。不同的检查方法具有不同的优缺点,用户可以根据具体情况,结合个人经验,选择最适合自己需求的检查方法。cat /etc/redhat-release命令可以打印出CentOS的发行版本信息,显示出CentOS的版本号和发行时间。4.使用rpm -q centos-release命令检查。rpm -q centos-release表明了更详细的CentOS版本信息,可以显示当前CentOS的版本号。lsb_release -a命令会输出CentOS的发行信息,可以查看CentOS的版本和相关信息。_查看centos版本

七十二、区间合并,插入求交集, 删除被覆盖区间_七十二插视-程序员宅基地

文章浏览阅读1.8k次。我从来不是一个呆在舒适区间的人,高中毕业,大学往死了干了三年,毕竟还是要靠实力说话啊,努力、自制、对照下,喜欢呆在舒适区间里人,没紧迫感、没压力、不思进取、“人无远虑必有近忧”的人。这么一想,我好像也有点强逼自己变得更强。_七十二插视

拼搏半个月,刷了 571道Java高频面试题喜提阿里 offer,定级 P7_java面试半个月-程序员宅基地

文章浏览阅读230次。今年较往年相比面试要难的多,大环境也是对于程序员的要求越来越高,环境是我们无法改变的,我们能改变的只有自己,月初我一好友,努力拼搏一周,刷完了这份阿里 P8 大牛整理的这 1000 道 Java 高频面试题笔记,拿到了阿里 P7 职位。在朋友面试的过程中这份笔记发挥了很大的作用,小编听到之后请好友吃了一顿铁锅炖大鹅,才要到这份笔记,在这儿小编给大家分享出来,希望可以帮大家渡过这个寒气逼人的秋天。_java面试半个月

Android开发-设置监听器的四种方法_安卓设置监听-程序员宅基地

文章浏览阅读1.1w次,点赞17次,收藏56次。Android四种监听方式:实现监听的接口实现匿名内部类使用外部类直接在xml中设置监听1、使用接口方式实现监听事件:可直接在Activity中定义事件处理方法优点:简洁缺点:可能造成程序结构混乱2、实现匿名内部类实现监听:优点:可以在当前类中复用该监听器,可自由访问外部类的所有界面组件3、使用外部类实现监听:优点:当某事件监听器被多个GUI界面共享_安卓设置监听

【文献翻译】基于深度学习的脑电信号癫痫自动检测系统_深度学习驱动的?检测:创新方法与技术实现【?检测实战-程序员宅基地

文章浏览阅读4.5k次。摘要癫痫是一种神经系统疾病,对于其检测,脑电图(EEG)是一种常用的临床方法。脑电信号的人工检测是一个费时费力的过程,这给神经科医生带来了沉重的负担,并影响了他们的表现。已经提出了几种使用传统方法的自动技术来帮助神经学家检测二元癫痫场景,例如癫痫与非癫痫或正常与发作。这些方法在对三元病例进行分类时表现不佳,例如,发作期与正常期与发作间期;采用最先进的方法,这种情况下的最大准确度为97±1%。为了克服这个问题,我们提出了一个基于深度学习的系统,它是金字塔一维卷积神经网络(P-1D-CNN)模型的集成。在CN_深度学习驱动的?检测:创新方法与技术实现【?检测实战

gtest中ASSERT与EXPECT断言的区别_assert和expect-程序员宅基地

文章浏览阅读1.2w次。参考资料查找到ASSERT断言与EXPECT断言的区别:ASSERT_* 系列的断言,当检查点失败时,退出当前函数(注意:并非退出当前案例)。EXPECT_* 系列的断言,当检查点失败时,继续往下执行。其中,对退出当前函数但是不退出当前案例不理解,于是查看了官方文档进行学习gtest文档地址:https://github.com/google/googletest/blob/mas..._assert和expect