二叉搜索树的第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 ≤ 二叉搜索树元素个数
Related Topics
树
深度优先搜索
二叉搜索树
二叉树
👍 389
👎 0
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public int kthLargest(TreeNode root, int k) {
}
}
思路
- 递归的把所有元素添加到数组中
- 添加的时候进行排序
实现
class Solution {
public int kthLargest(TreeNode root, int k) {
List<Integer> list = new ArrayList<>();
method(root,list);
return list.get(k-1);
}
private void method(TreeNode node, List<Integer> list){
if (node==null)return;
if (list.size()==0 || list.get(list.size()-1)>node.val){
list.add(node.val);
}
else if (list.get(0)<node.val){
list.add(0,node.val);
}
else {
for (int i=1;i<list.size();i++){
if (list.get(i)<node.val && list.get(i-1)>node.val){
list.add(i,node.val);
break;
}
}
}
method(node.left,list);
method(node.right,list);
}
}
结果
解答成功:
执行耗时:7 ms,击败了3.28% 的Java用户
内存消耗:43 MB,击败了20.40% 的Java用户
思路
- 使用Collections.sort来排序
优化1
class Solution {
public int kthLargest(TreeNode root, int k) {
List<Integer> list = new ArrayList<>();
method(root,list);
Collections.sort(list);
return list.get(list.size()-k);
}
private void method(TreeNode node, List<Integer> list){
if (node==null)return;
list.add(node.val);
method(node.left,list);
method(node.right,list);
}
}
结果
解答成功:
执行耗时:3 ms,击败了7.16% 的Java用户
内存消耗:43 MB,击败了20.40% 的Java用户
思路
- 通过观察,右边>中间>左边
- 递归的时候,添加到数组的顺序调整为右中左
优化2
class Solution {
public int kthLargest(TreeNode root, int k) {
List<Integer> list = new ArrayList<>();
method(root,k,list);
return list.get(k-1);
}
public void method(TreeNode node, int k, List<Integer> list){
if (node==null || k<=list.size()) return;
method(node.right,k,list);
list.add(node.val);
method(node.left,k,list);
}
}
结果
解答成功:
执行耗时:0 ms,击败了100.00% 的Java用户
内存消耗:42.7 MB,击败了35.07% 的Java用户