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

Posted 易小顺

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指 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);
    }
}

总结

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

以上是关于剑指 Offer 54. 二叉搜索树的第k大节点的主要内容,如果未能解决你的问题,请参考以下文章

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

LeetCode Java刷题笔记—剑指 Offer 54. 二叉搜索树的第k大节点

剑指Offer 54 - 二叉搜索树的第K大节点

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

每日一题 - 剑指 Offer 54. 二叉搜索树的第k大节点

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