leetcode 剑指 Offer 54. 二叉搜索树的第k大节点

二叉树 同时被 3 个专栏收录
60 篇文章 0 订阅
75 篇文章 1 订阅

【题目】剑指 Offer 54. 二叉搜索树的第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 ≤ 二叉搜索树元素个数

【解题思路1】中序遍历

用list存放中序遍历出来从大到小的一个列表,最后返回list.size() - k处的值就可以了

class Solution {
    public int kthLargest(TreeNode root, int k) {
        List<Integer> list = new ArrayList();
        dfs(root,list);
        return list.get(list.size() - k);
    }

    void dfs(TreeNode root, List list){
        if(root == null) return ;
        dfs(root.left,list);
        list.add(root.val);
        dfs(root.right,list);
    }
}

还可以进一步改进,正常中序遍历是 左根右,遍历出来是从小到大的顺序,改成右根左就是从大到小了

class Solution {
    int res;
    int count;
    public int kthLargest(TreeNode root, int k) {
        count = k;
        dfs(root);
        return res;
    }
    public void dfs(TreeNode root) {
        if(root == null)    return;
        dfs(root.right);
        if(--count == 0) {
            res = root.val;
            return;
        }
        dfs(root.left);
    }
}

时间复杂度:O(N)。当树退化为链表时(全部为右子节点),无论 k 的值大小,递归深度都为 N ,占用 O(N) 时间。
空间复杂度:O(N)。当树退化为链表时(全部为右子节点),系统使用 O(N) 大小的栈空间。

  • 0
    点赞
  • 0
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值