首页 > 其他分享 >剑指 Offer 54. 二叉搜索树的第k大节点

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

时间:2023-09-09 15:44:16浏览次数:66  
标签:TreeNode Offer int 54 dfs 二叉 root 节点

题目链接: 剑指 Offer 54. 二叉搜索树的第k大节点

题目描述:

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

解法思路:

  • 由于题目中二叉树是二叉搜索树(中序遍历是升序的),要求的是第 k 大的节点值,也就是倒数第 k 个数,
  • 因此可以转换一下遍历顺序,按照 右->根->左的顺序进行遍历的话,得到的顺序就是降序的,
  • 遍历 k 次即可

代码:

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */

func kthLargest(root *TreeNode, k int) int {
    var res int
    var dfs func(*TreeNode)
    dfs = func(root *TreeNode){
        if root == nil {
            return 
        }
        dfs(root.Right)
        k--
        if k == 0 {
           res = root.Val
        }
        dfs(root.Left)
    }
    dfs(root)
    return res
}

标签:TreeNode,Offer,int,54,dfs,二叉,root,节点
From: https://www.cnblogs.com/lxing-go/p/17689571.html

相关文章

  • 《剑指Offer》-20-表示数值的字符串
    这种按照一定规则来验证字符串的题看起来很麻烦,想到另外一道类似的是验证IP地址……我觉得我理不清这个判断逻辑以及各个逻辑间的关系以控制逻辑 boolisNumber(strings){ //首先这个字符串可能得样式为 //[若干可能的空格][[+/-][num./num.num/.num/num]][E/e][[+/-]......
  • 二叉树 层序
    相关阅读:https://programmercarl.com/0102.%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E5%B1%82%E5%BA%8F%E9%81%8D%E5%8E%86.html#_102-%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E5%B1%82%E5%BA%8F%E9%81%8D%E5%8E%86层序遍历即二叉树的广度优先遍历,使用队列先进先出的特性。#层序遍......
  • 剑指 Offer 61. puke牌中的顺子
    从若干副扑克牌中随机抽 5 张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为0,可以看成任意数字。A不能视为14。 classSolution{publicbooleanisStraight(int[]nums){intjoker=0;Arrays.sort(nu......
  • 【题解】CF1854E Game Bundles
    你考虑我们需要构造出一组解,显然地这样的解有很多很多种(\({60^{60}}\)显然是及其地大)。那关键是我们如何进行构造。我们很容易知道每个集合里面\(>30\)的数只有一个。所以我们可以在\([1,30]\)中随机\(a_i\),直到满足的组数恰好小于等于\(a_i\),添加的时候维护数组\(f_i......
  • 【题解】CF1854D Michael and Hotel
    交互题。考虑题意即为找到\(1\)所在内向基环树上的所有点。我们考虑我们怎么找到环上的点,我们考虑我们可以\(O(\logn)\)询问到一个环上的点,方法即为将\(k\)定为一个大数,然后二分点集。然后我们便可以在\(O(n\logn)\)的时间复杂度内找到所有环上的点(我们一会儿再讲怎......
  • 【题解】CF1854C Expected Destruction
    你考虑,我们如果没有重合就将元素删去的操作,我们就有答案:\(n\times(m+1)-\sum\limits_{i=1}^na_i\)但是,我们显然最后的答案是小于这个的,如果有两个数在\(i\)相撞,那么我们的答案就会减少\((m-i+1)\)我们设\(f_{i,j}\)表示两个数分别在\(i\)和\(j\)的概率\((i\leqj......
  • 【Android 开发】金九银十斩获offer秘籍:简历优化+Android大厂面试真题
    前言面试是一场没有硝烟的战争,这句话看有点危言耸听,但是在面试中考验的确无处不在。金九银十已经开始一个星期了,在面试或准备面试的小伙伴如果你在面试中对面试官所问的问题感到有困难时,那说明是我们的基础功没打好,或者是对面试题了解的还不够多。如果是连面试邀约都没有的小伙伴,咱......
  • 【题解】CF1854B Earn or Unlock
    你考虑,我们很容易地可以构造一个\(n^2\)的DP:\(f_{i,j}\)表示当前在\(i\)张牌,还可以摸\(j\)张牌的最大分数。转移也很好转移,你考虑一眼就会。但是我们显然要缩减复杂度,我们看到数据范围\(10^5\),想到了根号。分块???显然不行。莫队???都没有区间查询,怎么行呢?然后你苦思冥想......
  • 【题解】CF1854A2 Dual (Hard Version)
    你考虑我们A1只需要通过自加凑一个最大的数,然后将所有的数都变成正数,最后做一次前缀和即可。(不懂可以看看落谷题解)好,我们现在去看HardVersion的\(31\)次操作怎么分配:前缀和(全为正)/后缀和(全为负)——\(19\)次还剩下\(12\)次,不知道该怎么做。我们的目标便变......
  • 剑指 Offer 53 - II. 0~n-1中缺失的数字
    题目链接:剑指Offer53-II.0~n-1中缺失的数字题目描述:解法思路:代码:funcmissingNumber(nums[]int)int{varresint//注意这里,加1(因为要计算0~n个数的和)n:=len(nums)+1ifn==0{returnres}res=(n-1)*n/2for_,v......