返回
LeetCode 54: 探索二叉搜索树的 k 个最大元素
前端
2023-09-19 00:43:31
前言
LeetCode 54 题目是查找二叉搜索树的第 k 大节点。二叉搜索树是一种有序的二叉树,其性质是左子树中所有节点的值都小于根节点,而右子树中所有节点的值都大于根节点。因此,可以通过中序遍历二叉搜索树,按照升序的方式遍历所有节点,并将节点的值存储在一个数组中。然后,返回数组中第 k 个元素,即可得到二叉搜索树的第 k 大节点。
中序遍历
中序遍历是一种深度优先搜索算法。它的基本思想是先遍历左子树,然后访问根节点,最后再遍历右子树。在二叉搜索树中,中序遍历的顺序是从小到大排列的。因此,我们可以通过中序遍历二叉搜索树,并将节点的值存储在一个数组中,然后返回数组中第 k 个元素,即可得到二叉搜索树的第 k 大节点。
递归算法
def kth_largest(root, k):
# 中序遍历二叉搜索树
def inorder(root):
if not root:
return
inorder(root.left)
res.append(root.val)
inorder(root.right)
res = []
inorder(root)
return res[k-1]
非递归算法
def kth_largest(root, k):
stack = []
res = []
while stack or root:
# 一直向左遍历
while root:
stack.append(root)
root = root.left
# 弹出栈顶元素并访问
root = stack.pop()
res.append(root.val)
# 若 res 数组的长度达到 k,则返回结果
if len(res) == k:
return res[-1]
# 访问右子树
root = root.right
return None
时间复杂度
递归算法和非递归算法的时间复杂度都是 O(n),其中 n 是二叉搜索树的节点数。
空间复杂度
递归算法的空间复杂度为 O(n),因为在递归的过程中,需要存储递归栈。非递归算法的空间复杂度为 O(1),因为不需要存储递归栈。
总结
LeetCode 54 题目是查找二叉搜索树的第 k 大节点。我们可以通过中序遍历二叉搜索树,并将节点的值存储在一个数组中,然后返回数组中第 k 个元素,即可得到二叉搜索树的第 k 大节点。递归算法和非递归算法都可以解决这个问题,但非递归算法的空间复杂度更低。