给定一个二叉搜索树的根节点 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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
时间
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]
时间
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