剑指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);
}
}
}