LeetCode 230. Kth Smallest Element in a BST

问题描述

  • Given a binary search tree, write a function kthSmallest to find the kth smallest element in it.
  • Note:
    You may assume k is always valid, 1 ≤ k ≤ BST’s total elements.
  • Follow up:
    What if the BST is modified (insert/delete operations) often and you need to find the kth smallest frequently? How would you optimize the kthSmallest routine?
  • 地址

问题分析

  • 该题和 剑指offer-二叉搜索树的第k个结点一样 ,求 BST的第k小的节点。
  • 利用BST中序遍历的结果便是升序序列的性质,很容易找到第K个
    • 非递归法
    • 递归法
  • 该题的 Follow up 比较有意思,说是如何该二叉树经常进行插入删除操作,也经常进行找到第k个元素的操作,那么如何快速的到第k小的元素?
    改变节点的结构,每一个节点同时存储它的左子树所有节点数目,这样便可以根据 k 与 当前根节点的大小,来选择恰好是当前根,还是第k个元素在左子树中,需递归左子树,或者第k个元素在右子树中,需递归右子树。 log(N)的时间复杂度。

代码实现

  • 非递归法
public int kthSmallest(TreeNode root, int k) {
        if (root == null || k <= 0) {
            return 0;
        }
        Stack<TreeNode> stack = new Stack<>();
        TreeNode curNode = root;
        while (curNode != null || ! stack.isEmpty()) {
            while (curNode != null) {
                stack.push(curNode);
                curNode = curNode.left;
            }
            curNode = stack.pop();
            //看是否到第k个节点了
            if (--k == 0) {
                return curNode.val;
            }
            curNode = curNode.right;
        }
        return 0;
    }
  • 递归法
 public int kthSmallest(TreeNode root, int k) {
        if (root == null || k < 0) {
            return 0;
        }
        int[] count = new int[1]; 
        count[0] = 0;
        TreeNode res = kthSmallest(root, count, k);
        //若找到第k个节点,返回该值
        return res == null ? 0 : res.val;
    }

    // 在已经查找到了count[0]个节点之后,查找第K个节点,若找到了返回该节点,找不到,返回null
    public TreeNode kthSmallest(TreeNode root, int[] count, int k) {
        if (root == null) {
            return null;
        }
        //在左子树查找
        TreeNode leftRes = kthSmallest(root.left, count, k);
        if (leftRes != null) {//已经找到第k个节点
            return leftRes;
        }
        //尚不足k个
        if (++count[0] == k) {//当前节点
            return root;
        }
        //右子树查找
        return kthSmallest(root.right, count, k);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值