Loading

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

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

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

示例 1:

输入: root = [3,1,4,null,2], k = 1
   3
  / \
 1   4
  \
   2
输出: 4

示例 2:

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

限制:

1 ≤ k ≤ 二叉搜索树元素个数

解题思路

使用递归的中序遍历二叉树, 在遍历的同时进行计数, 当计数值小于K时, 继续遍历, 等于K时, 返回当前节点值, 大于K时, 直接返回值。

class Solution {

    private int curSeq = 0;
    int res = 0;

    public int kthLargest(TreeNode root, int k) {
        if (root == null) {
            return 0;
        }
        // 先遍历右子树
        kthLargest(root.right, k);
        // 然后遍历当前节点, 并且计数器自增
        curSeq++;
        if (curSeq == k) {
            // 计数器为K, 说明当前是RNL遍历的第K个节点 全局变量保存当前的结果
            res = root.val;
        } else if (curSeq < k) {
            // 如果当前节点还是小于K, 则继续递归遍历左子树
            kthLargest(root.left, k);
        }
        // 返回结果, 若遍历完左子树之后还是小于K, 当前的结果还不是最终的结果
        return res;
    }
}
posted @ 2021-01-17 22:52  反身而诚、  阅读(49)  评论(0编辑  收藏  举报