还是做简单题有成就感,看到题就有了想法,先来一个中序遍历放到一个容器里面,然后按下标找到第k大的数就行,这是我的代码。
class Solution {
Deque<Integer> deque = new LinkedList<Integer>();
public int kthLargest(TreeNode root, int k) {
if(root == null)return 0;
dfs(root);
Object[] res = deque.toArray();
int a= Integer.parseInt(res[k-1].toString());
return a;
}
private void dfs(TreeNode root){
if(root == null) return;
dfs(root.left); //左
deque.addFirst(root.val); //根
dfs(root.right); //右
}
}
dfs()来个中序遍历放到双端队列中,然后把队列转换成数组,这里转换成的是object数组,取出object再把object转换成int,本来想用get(k)但是不知道为什么报错了,就转换成数组了。
写完后看了一下题解,题解就更简单了,因为左根右的中序是从小到大的,它用右根左,这样就是从大到小了,然后每遍历一个数k就自减,当k等于0的时候把这个是保存然后返回这个数就可以。
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);
}
}