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

说明:java

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


题目描述svg

(1)力扣:this

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

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

思路分析:xml

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

参考代码:it

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)牛客:io

题目描述

给定一棵二叉搜索树,请找出其中的第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);
    }
}

(完)