二叉搜索树的第 k 大节点
给定一棵二叉搜索树,请找出其中第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 ≤ 二叉搜索树元素个数
来源:力扣(LeetCode)
解题思路
此题先遍历二叉树,根据这个树的特点,可以采用中序遍历,可以发现这个树是一个递增序列,为了方便题目写法可以采用中序遍历倒序(即 右→根→左)得到一个递减的序列,
- List item
// 打印中序遍历
void dfs(TreeNode root) {
if(root == null) return;
dfs(root.left); // 左
System.out.println(root.val); // 根
dfs(root.right); // 右
}
// 打印中序遍历倒序
void dfs(TreeNode root) {
if(root == null) return;
dfs(root.right); // 右
System.out.println(root.val); // 根
dfs(root.left); // 左
}
递归解析:
- 若节点为空,return
- 递归右子树
- 判断是否满足第K大的条件:(
k=0,已经找到第k大的节点,无需遍历,提前结束。
k=k-1,序号依次递减。
k-1=0时,代表当前节点为第 kk 大的节点,记录
) - 递归左节点
代码如下
class Solution {
int res, k;
public int kthLargest(TreeNode root, int k) {
this.k = k;
dfs(root);
return res;
}
void dfs(TreeNode root) {
if(root == null) return;
dfs(root.right);
if(k == 0) return;
if(-- k == 0) res = root.val;
dfs(root.left);
}
}