题目描述: 给定一个二叉搜索树,编写一个函数来寻找其中第 k 个最小元素。(假设 k 总是有效的)
二叉搜索树的好性质就是左子树中的元素总小于根节点,右子树中的元素总大于根节点,因此二叉搜索树的中序遍历返回的就是一个排序了的数组,找到第 k 个元素即可,还可以对遍历计数,从而实现早停,进一步优化时间复杂度。我自己写了一个非递归的,另外附上别人实现的递归写法
def kthSmallest(root, k):
ans, count = None, k
stack, cur = [], root
while stack or cur:
while cur:
stack.append(cur)
cur = cur.left
cur = stack.pop()
ans = cur.val
count -= 1
if count == 0:
return ans
cur = cur.right
def kthSmallest(root, k):
self.res, self.count = None, k
def inorder(root):
if not root: return
inorder(root.left)
if self.res: return
self.count -= 1
if not self.count: self.res = root.val
inorder(root.right)
inorder(root)
return self.res