1. 题目
给定一棵二叉搜索树,请找出其中第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 ≤ 二叉搜索树元素个数
Related Topics 树
👍 161 👎 0
2. 题解
2.1 解法1: 保存中序遍历结果, 后再查找
class Solution {
public int kthLargest(TreeNode root, int k) {
if (root == null) {
return 0;
}
List<Integer> list = new ArrayList<>();
dfs(root, list);
return list.get(list.size() - k);
}
public void dfs(TreeNode root, List<Integer> list) {
if (root == null) {
return;
}
dfs(root.left, list);
list.add(root.val);
dfs(root.right, list);
}
}
2.2 解法2: 使用倒序中序遍历
- 以递归的右根左顺序访问树, 得到的序列是递减序列
- 在递归过程中, 记录访问的结点次数, 当 k减到 0 时, 即为结果
class Solution {
int n = 0, ans = 0;
public int kthLargest(TreeNode root, int k) {
this.n = k;
dfs(root);
return ans;
}
public void dfs(TreeNode root) {
if (root == null) {
return;
}
dfs(root.right);
if (--n == 0) {
ans = root.val;
return;
}
dfs(root.left);
}
}