剑指Offer之二插搜索树的第k大/小结点

说明:

该题牛客和力扣有点区别,下面分别来进行解决。


题目描述

(1)力扣:

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

注意:这里是求第k大结点,而且题目给的返回值为int,是个数值。

思路分析:

求二插搜索树的第k大结点,则用右根左的方式遍历二叉树序列,结果为递减序列,找到其中的第k个元素即可。

参考代码:

class Solution {
    private int res;//定义成员变量
    private int k;//定义成员变量
    public int kthLargest(TreeNode root, int k) {
        if(root == null || k < 0)return -1;
        this.k = k;//赋值
        dfs(root);
        return res;//这里返回的是第k大结点的 结点值
    }

    public void dfs(TreeNode root){
        if(root == null)return;
        if(k == 0) return;
        //右
        dfs(root.right);
        //根
        if(--k == 0)res = root.val;//别忘了--
        //左
        dfs(root.left);
    }
}

(2)牛客:

题目描述

给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。

注意:这里是求第k小结点,而且题目给的返回值为TreeNode,是个结点。

思路分析:

求二插搜索树的第k小结点,则用左根右的方式遍历二叉树序列,结果为递增序列,找到其中的第k个元素即可。

参考代码:

class Solution {
    private TreeNode res;//定义成员变量,注意这里成了结点类型
    private int k;//定义成员变量
    TreeNode KthNode(TreeNode root, int k){
        if(root == null || k < 0)return null;
        this.k = k;//赋值
        dfs(root);
        return res;//这里返回的是 第k小的结点
    }

    public void dfs(TreeNode root){
        if(root == null)return;
        if(k == 0) return;
        //左
        dfs(root.left);
        //根
        if(--k == 0)res = root;//别忘了--
        //右
        dfs(root.right);
    }
}

(完)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值