思路:
二叉搜索树的中序遍历是递增的!(左、根、右)
可以利用这个特性,进行中序遍历逆序的遍历(右、根、左)
代码:
class Solution {
int res=-1,k;
public int kthLargest(TreeNode root, int k) {
this.k=k;
dfs(root);
return res;
}
private void dfs(
TreeNode root
){
if(root==null){
return;
}
//中序遍历倒序:右、根、左
dfs(root.right);
if(k==0){
return;
}
if(--k==0){
res=root.val;
}
dfs(root.left);
}
}
分解:
1)二叉搜索树的中序遍历是递增的
可以利用这个特性,进行中序遍历逆序的遍历(右、根、左)
这样就可以得到降序的值
2)k和res都可以设置为全局变量
k要在全局做自减,res也是在全局只得到一个答案即可
复杂度分析:
时间复杂度:O(N) 最差情况下都退化为右倾的二叉树,此时无论k为何树,都要递归到深度为N的地方得到第一个右节点
空间复杂度:O(N) 最差情况下退化为右倾的二叉树,存储N个元素