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

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]

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值