
还是做简单题有成就感,看到题就有了想法,先来一个中序遍历放到一个容器里面,然后按下标找到第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);
    }
}



















