• 230. 二叉搜索树中第K小的元素


    题目-中等难度

    给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 个最小元素(从 1 开始计数)。

    示例

    示例 1:
    在这里插入图片描述

    输入:root = [3,1,4,null,2], k = 1
    输出:1

    示例 2:
    在这里插入图片描述

    输入:root = [5,3,6,2,4,null,null,1], k = 3
    输出:3

    提示:

    • 树中的节点数为 n 。
    • 1 <= k <= n <= 104
    • 0 <= Node.val <= 104

    进阶:

    如果二叉搜索树经常被修改(插入/删除操作)并且你需要频繁地查找第 k 小的值,你将如何优化算法?

    来源:力扣(LeetCode)
    链接:https://leetcode.cn/problems/summary-ranges
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    1. bfs

    时间
    32ms
    击败 87.75%使用 Python 的用户
    内存
    20.12MB
    击败 21.25%使用 Python 的用户

    # Definition for a binary tree node.
    # class TreeNode(object):
    #     def __init__(self, val=0, left=None, right=None):
    #         self.val = val
    #         self.left = left
    #         self.right = right
    class Solution(object):
        def kthSmallest(self, root, k):
            """
            :type root: TreeNode
            :type k: int
            :rtype: int
            """
            # 存储根节点到li列表
            li = [root]
            # 存储根节点值到vLi列表
            vLi = [root.val]
            # 当li列表不为空
            while li:
                # 获取当前节点
                a= li.pop()
                # 如果当前节点存在左节点, 添加左节点到li列表作为之后需要遍历的节点,
                # 同时添加节点值到vLi, 方便之后给节点值排序
                if a.left:
                    li.append(a.left)
                    vLi.append(a.left.val)
                # 如果当前节点存在右节点,添加右节点到li列表作为之后需要遍历的节点
                # 同样添加节点值到vLi
                if a.right:
                    li.append(a.right)
                    vLi.append(a.right.val)
            # 第k小的元素再索引k-1位置
            return sorted(vLi)[k-1]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    2. 中序遍历

    时间
    40ms
    击败 49.13%使用 Python 的用户
    内存
    20.03MB
    击败 51.12%使用 Python 的用户

    # Definition for a binary tree node.
    # class TreeNode(object):
    #     def __init__(self, val=0, left=None, right=None):
    #         self.val = val
    #         self.left = left
    #         self.right = right
    class Solution(object):
        def kthSmallest(self, root, k):
            """
            :type root: TreeNode
            :type k: int
            :rtype: int
            """
            # 创建栈
            s = []
            # 如果节点存在或者s不为空, 继续遍历
            while root or s:
                # 当节点存在
                while root:
                    # 添加节点到s栈
                    s.append(root)
                    # 最左节点为最小值, 所以遍历到最左节点位置, 依次添加中途经过的节点到s栈
                    root = root.left
                # 获取栈内最新添加的节点
                root = s.pop()
                # 次数-1
                k -= 1
                # 如果次数为0, 代表找到需求节点
                if k == 0:
                    # 返回需求节点的值
                    return root.val
                # 继续运行就代表没找到, 查询当前节点是否有右节点,
                # 有的话下一次遍历从右节点开始, 没有则继续遍历栈中元素
                root = root.right
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
  • 相关阅读:
    k8s yaml文件编写技巧
    vue中使用history.replaceState 更改url vue router 无法感知的问题
    AI原生应用速通指南
    小米12sUltra什么时候发布 小米12sUltra配置如何
    程序员刚毕业,先去大厂镀金还是先去小厂攒经验?
    通义千问1.5(Qwen1.5)大语言模型在PAI-QuickStart的微调与部署实践
    Android逆向学习(番外一)smali2java部分文件无法反编译的bug与修复方法
    zookeeper + kafka消息队列
    react小记/基本语法/reactjs整理(持续更新)
    【面试经典150 | 数组】轮转数组
  • 原文地址:https://blog.csdn.net/Ashiu/article/details/132939325