二叉树刷题记(六-二叉搜索树的第k大节点)

简介: 二叉树刷题记(六-二叉搜索树的第k大节点)

前言

今天更新到了第七天,终于达到了更文第一关的要求 ,写文章费了不少的时间(小嘟本身就写的很慢,再加上我对文章的质量有一定的要求,所以就...),但是一想到更文奖励,我就又动力啦!!!哈哈哈。

小嘟还是会保证文章质量的,不会因为为了参加活动就发一些水文,觉得这样既浪费了读者的时间,也浪费了小嘟的时间,最后,文章没什么价值可言,这也是我不愿意看到的。

希望读者看完能有所收获。

今日,还是回到更新二叉树系列,文章不会很长,请读者耐心阅读。

注:本嘟是个算法渣渣,(面试的时候让写个非递归的后序遍历都没有写出来,唉),so,我写文章的目的是为了帮助那些想学习算法,但是算法题目看了之后依然很迷茫的读者,大神请绕过哦!

目的

  • 本文目的:小嘟带着读者做做二叉树相关的题目,然后小嘟把自己的感悟总结出来。
  • 之前已经带大家将二叉树的三种遍历算法都学完了(包括递归和非递归),不会的请滑到文章底部,小嘟在底部放着链接哦!


正文

  • 首先,还是先看题目


  • 题目描述,让我们找一个二叉搜索树的第K大节点,小嘟还是在放一张图,看图直观点


  • 这里有一个二叉树的名词,二叉搜索树,那么什么是二叉搜索树呢?
  • 小嘟叨叨时刻:二叉搜索树,小嘟的理解就是一个结点的左孩子小于它,它的右孩子大于它,故此,我们可以知道二叉搜索树有一个性质:一个结点的左子树的val都小于等于它,它的右子树的val都大于等于它


概念搞清楚了,那就好好分析题目


首先由题目的限制条件可以知道,root不是一个空树(因为它k的限制条件告诉我们它肯定能找到一个元素)

我们要找到第K大元素,那么我们就要先遍历二叉树?怎样遍历这是一个问题。仔细想想:要遍历而且要找到第K大元素,那么我们首先是不是要找到一个递增或递减的顺序呢?哦,悟了悟了!我们要找这样的一个顺序,要么递增,要么递减。

现在就该想想我们该用那种遍历方式呢?前序?中序?后序?想想它们的遍历顺序,再结合二叉树的性质,还有就是我们要找的是一个递增或者递减的顺序。

分析之后,我们选择了中序遍历,这是一个递增的顺序。(还有一种方法哦!不知道给起个什么名字,暂且叫我假中序遍历,哈哈哈)

直接看代码呗

  • 递归版的
var kthLargest = function(root, k) {
    let res=[];
    const Kmax = (root01)=>{
        if(root01 == null) return;
        Kmax(root01.left);
        res.push(root01.val);
        Kmax(root01.right)
    }
    Kmax(root);
    let length = res.length;
    return res [length-k];
};

  • 迭代版的
var kthLargest = function(root, k) {
    let res=[];
    let stack = [];
    while(root || stack.length ){
        while(root){
            stack.push(root);
            root = root.left;
        }
        let node = stack.pop();
        res.push(node.val);
        root = node.right;
    }
    let length = res.length;
    return res [length-k];
};


另一种方法
  • 我们的思路还是不变,还是要找一个有序的顺序,我们找的是一个递减的顺序。
  • 递归版的
var kthLargest = function(root, k) {
    let res=[];
    const Kmax = (root01)=>{
        if(root01 == null) return;
        Kmax(root01.right);
        res.push(root01.val);
        Kmax(root01.left)
    }
    Kmax(root);
    return res[k-1];
};

  • 迭代版的
 var kthLargest = function(root, k) {
    let res=[];
    let stack = [];
    while(root || stack.length ){
        if(res.length == k) return res[k-1];
        while(root){
            stack.push(root);
            root = root.right;
        }
        let node = stack.pop()
        res.push(node.val);
        root = node.left;
    }
    return res[k-1];
};

  • 啦啦啦,小嘟讲完啦,感觉还是二叉树问题离不开三种遍历方式,所以我们要做二叉树相关的题目,首先还是要掌握三种最基本的遍历顺序。
    溜啦溜啦...

结尾

  • 希望各位学习算法的朋友能够坚持下去,加油
  • 若有任何问题,欢迎下方留言,小嘟看到会第一时间回复的。
  • 创作不易,觉得还不错的,欢迎支持支持!
  • 多想多做多尝试,实在不会的话,直接看代码,用代码来理解。
目录
打赏
0
0
0
0
4
分享
相关文章
Android 利用MediaPlayer实现音乐播放
本文提供了一个简单的Android MediaPlayer音乐播放示例,包括创建PlayerActivity、配置AndroidManifest.xml和activity_player.xml布局,以及实现播放和暂停功能的代码。
182 0
Android 利用MediaPlayer实现音乐播放
探索机器学习在金融风控中的应用
【5月更文挑战第27天】 随着大数据和人工智能技术的飞速发展,机器学习已经成为金融行业风险控制的重要工具。本文将探讨机器学习技术如何革新传统金融风控模式,提升识别欺诈行为和信用评估的准确性。通过分析不同算法的应用案例,我们揭示了机器学习在处理复杂数据集、预测市场趋势以及优化风险管理流程中的关键作用。文章还讨论了机器学习在实施过程中面临的挑战,包括数据隐私保护、模型透明度和解释能力等问题。
Elasticsearch Serverless体验
通过这次体验探究阿里云Elasticsearch Serverless版的基本功能、性能表现以及稳定性。同时也会针对Elasticsearch版进行对比分析。
549 68
阿里巴巴为什么不用 ZooKeeper 做服务发现?
服务发现,ZooKeeper 真的是最佳选择么?而回望历史,我们也偶有迷思,在服务发现这个场景下,如果当年 ZooKeeper 的诞生之日比我们 HSF 的注册中心 ConfigServer 早一点会怎样?
12351 6
redis的持久化方式RDB和AOF的区别
1、前言 最近在项目中使用到Redis做缓存,方便多个业务进程之间共享数据。由于Redis的数据都存放在内存中,如果没有配置持久化,redis重启后数据就全丢失了,于是需要开启redis的持久化功能,将数据保存到磁盘上,当redis重启后,可以从磁盘中恢复数据。
1396 1

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等