剑指 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大节点的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode Java刷题笔记—剑指 Offer 54. 二叉搜索树的第k大节点