230. 二叉搜索树中第K小的元素
题目描述
解题思路
- 二叉搜索树的中序遍历是有序(升序)的,利用这个性质。
- 二叉搜索树性质:
- 左子树节点值均比根节点值小,右子树节点值均比根节点值大。这是解题思路的来源。
- 左右子树均保持性质1。
代码实现
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
# ptr = 0
def kthSmallest(self, root: TreeNode, k: int) -> int:
"""
二叉搜索树的中序遍历是有序(升序)的,利用这个性质。
内部函数使用到k和返回结果,需要全局变量,因此self.k = k; self.res = None
"""
self.k = k
self.res = None
def inorder(root: TreeNode) -> List[int]:
if root is None:
return
inorder(root.left)
self.k -= 1
if self.k == 0:
self.res = root.val
inorder(root.right)
inorder(root)
return self.res
def kthSmallest1(self, root: TreeNode, k: int) -> int:
# 二叉搜索树的中序遍历是有序(升序)的,利用这个性质即可
def inorder(root: TreeNode) -> List[int]:
if root is None:
return []
return inorder(root.left) + [root.val] + inorder(root.right)
return inorder(root)[k - 1]
上面算法最坏情况每个节点遍历一遍,时间复杂度O(N)。
一个高效的优化思路:在每个BST树的节点中维护排名,这样可以直接比较排名,时间复杂度O(logN)。