leetcode第230题, 二叉搜索树中第K小的元素,java实现

15 篇文章 0 订阅

一、迭代法

运行结果

执行结果:通过
执行用时 :1 ms, 在所有 Java 提交中击败了83.31%的用户
内存消耗 :37.9 MB, 在所有 Java 提交中击败了25.55%的用户

代码与注释

// 求解思路:题目已知条件是二叉搜索树,中序遍历得到的结果就是升序的。
class Solution {
    public int kthSmallest(TreeNode root, int k) {
        LinkedList<TreeNode> list = new LinkedList<>();

        // 中序遍历
        while (root != null || !list.isEmpty())
        {
            while (root != null)
            {
                list.add(root);
                root = root.left;
            }
            root = list.removeLast();
            if (--k == 0) return root.val;
            
            root = root.right;
        }
        return -1;
    }
}

做题体会

  1. 二叉搜索树(又称二叉排序树,BST),节点取值,左子树小于根节点,根节点小于右子树,采用中序遍历的方式得到的结果恰好是升序的。
  2. 利用升序的先天条件,可以进行中序遍历,结合递归的思想,当从第一个叶子结点开始,遍历到第k个,得到的值即为第k小的元素。这个过程无需对中间数据进行记录。
  3. 采用递归的方式,遇到最终结果可以提前终止。
  4. 其中- -k==0与k- -==0的区别:- -k先减,后判断,k- -是先判断,后减。
  5. 前序搜索、中序搜索、后序搜索均属于深度优先搜索(DFS),对应广度优先搜索(BFS)。前序、中序、后序指的是根节点出现的次序,根节点最先出现就是前序,其他情况类似。最简单的方式是用三个节点分析,这里用7个节点的二叉树举例。在这里插入图片描述
  6. 时间复杂度:O(logN+k),到达叶子节点:logN,遍历到第k个数:k。
    空间复杂度:O(logN),无需额外k的空间记录出现的元素,通过- -k==0实现,所以平均需要二叉树深度的存储空间:logN。
  7. 如果二叉树一般化,不是BST,可以在遍历树的过程中维护一个size为k的大顶堆,当遍历完成,最终结果出现在堆顶。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值