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?
Hint:
- Try to utilize the property of a BST.
- What if you could modify the BST node's structure?
- The optimal runtime complexity is O(height of BST).
题意:
给一个二叉搜索树,写一个函数,找到第k小的元素
注意:
可以假设k一直是有效的,即1 ≤ k ≤ BST的元素个数总和
思考:
如果这个BST经常被修改进行插入删除等操作并且需要频繁地找到第k小的元素,你需要怎么优化函数?
提示:
1.利用BST的属性
2.如何可以修改BST的节点结构,该如何做
3.最优时间复杂度是O(height of BST)
参考:
http://bookshadow.com/weblog/2015/07/02/leetcode-kth-smallest-element-bst/
BST具有如下性质:
左子树中所有元素的值均小于根节点的值
右子树中所有元素的值均大于根节点的值
因此采用中序遍历(左 -> 根 -> 右)即可以递增顺序访问BST中的节点,从而得到第k小的元素,时间复杂度O(k)
Python
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def kthSmallest(self, root, k):
"""
:type root: TreeNode
:type k: int
:rtype: int
"""
stack=[]
node=root
while node:
stack.append(node)
node=node.left
x=1
while stack and x<=k:
node=stack.pop()
x+=1
right=node.right
while right:
stack.append(right)
right=right.left
return node.val