题目描述
给定一棵二叉搜索树,请找出其中第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)
链接:https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-di-kda-jie-dian-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解法
1.先序遍历+排序
思路
首先定义个List,先序遍历整个树,并将每个节点的值保存到List中。之后,将整型数组排序,最后求的k个最大值。这是最直接想到的方法。
代码
public int kthLargest(TreeNode root, int k) {
List<Integer> nums = new ArrayList<>();
dfs(nums, root);
int[] nums_i = new int[nums.size()];
for(int i=0; i<nums_i.length; i++){
nums_i[i] = nums.get(i);
}
Arrays.sort(nums_i);
return nums_i[nums_i.length-k];
}
private void dfs(List<Integer> n, TreeNode r){
if(r==null) return;
n.add(r.val);
dfs(n, r.left);
dfs(n, r.right);
}
2.中序遍历
思路
对于一个二叉搜索树来说,中序遍历的顺序是按照升序。如果将中序遍历的左、右子树调用顺序调换,遍历的顺序就变成了降序。按照这个方法,只需要累计遍历的第k个结果即为题解。
java代码
private int res, num;
public int kthLargest(TreeNode root, int k) {
if(root==null) return 0;
this.num = k;
dfs(root);
return res;
}
private void dfs(TreeNode r){
if(r==null) return;
if(num<1) return;
dfs(r.right);
if(num==1)
this.res = r.val;
num--;
dfs(r.left);
}