剑指Offer_#54_二叉搜索树的第k大节点

剑指Offer_#54_二叉搜索树的第k大节点

Contents

题目

给定一棵二叉搜索树,请找出其中第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大的数字,不需要得到其他数字,所以没必要把所有数字都遍历,而是遇到第k大的数字,就可以结束。所以我们只需要用两个变量,res用于保存当前遍历到的数字,count做计数器,当count == k时,返回当前的数字res

解答

class Solution {
    int count = 0,res = 0;
    public int kthLargest(TreeNode root, int k) {
        recur(root,k);
        return res;
    }
    //右-根-左中序遍历,是从大到小的顺序
    private void recur(TreeNode root, int k){
        if(root != null){
            recur(root.right,k);
            count ++;
            if(count == k) res = root.val;
            recur(root.left,k);
        }
    }
}
原文地址:https://www.cnblogs.com/Howfars/p/13355439.html