题目
解题思路
二叉搜索树中序遍历序列为递增序列,要找到第 k 大节点,也就是寻找 【中序遍历倒序的第 k 个节点】。
算法流程:
- 递归终止条件:
root == null
,表示已经越过了叶节点,直接返回。 - 递归右子树:
dfs(root.right)
- 三项工作:
1提前返回:若k == 0
,说明已经找到了目标节点,不需要继续遍历,直接返回;
2统计序号:k = k - 1
,即从 k 减到 0;
3记录结果:若k == 0
,说明当前节点就是第 k 大节点,res = root.val
- 递归左子树:
dfs(root.left)
具体代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
int res, 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);
}
}
复杂度分析
- 时间复杂度: O ( n ) O(n) O(n),n 为二叉搜索树节点总数。当树退化为链表(均为右子节点)时,无论 k 值为多少,递归深度均为 n
- 空间复杂度: O ( n ) O(n) O(n),当树退化为链表(均为右子节点)时,使用 O ( n ) O(n) O(n) 的额外栈空间。