返回

LeetCode 54: 探索二叉搜索树的 k 个最大元素

前端

前言

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 大节点。递归算法和非递归算法都可以解决这个问题,但非递归算法的空间复杂度更低。