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

算法记录

LeetCode 题目:

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



说明

一、题目

  输入: root = [5,3,6,2,4,null,null,1], k = 3
  输出: 4

二、分析

  • 二插搜索树的性质是右子树上的节点大于根节点,左子树上的节点小于根节点,可以采用中序遍历直接拿到排序的串儿,然后再输出。
  • 这里根据其性质,来递归的寻找:
  • 如果右子树的节点个数大于了 K 的值,那么此节点只会存在右子树中;
  • 如果右子树的节点个数再加上 1 也就是加上根节点的个数等于了 K ,第K大节点就是根节点;
  • 上面都不满足,那么此节点只能存在左子树中,但是在递归中需要缩小查找的节点范围,也就是 K 值减去右子树节点数加一的值,因为要剔除掉这么多个比 K 节点大的节点。
  • 所以核心就落在怎么求解右子树的节点个数身上。
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public int getCount(TreeNode root) {
        if(root == null) return 0;
        return 1 + getCount(root.left) + getCount(root.right);
    }
    public int kthLargest(TreeNode root, int k) {
        int count = getCount(root.right);
        if(count >= k) return kthLargest(root.right, k);
        if(count + 1 == k) return root.val;
        return kthLargest(root.left, k - count - 1);
    }
}

总结

熟悉二插搜索树的性质特点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值