题目
给定一棵二叉搜索树,请找出其中第 k 大的节点的值。
思路
二叉搜索树的中序遍历为 递增序列
则二叉搜索树的 中序遍历倒序 为 递减序列
因此,求 “二叉搜索树第 k
大的节点” 可转化为求 “此树的中序遍历倒序(右中左) 的第 k
个节点”
算法流程如下:
java代码如下:
class Solution{
int count = 0, ans = 0;//形参k不能随着dfs的迭代而不断变化,为了记录迭代进程和结果,引入类变量count和res。
public int kthLargest(TreeNode root, int k) {
count = k;//利用形参值k对类变量count进行初始化
dfs(root);//这里不要引入形参k,dfs中直接使用的是初始值为k的类变量count
return ans;
}
public void dfs(TreeNode root){
if(root == null) return;//当root为空,直接返回,这里并不需要判断count == 0,因为count最开始不可能为0
//倒序中序遍历,即右→中→左
dfs(root.right);//右
if(--count == 0){//先--,再判断,如果count==0,说明这就是第倒数k个数
ans = root.val;
return;//这里的return可以避免之后的无效迭代dfs(root.left),因为已经找到答案了
}
dfs(root.left);//左
}
}