跳过正文
  1. leetcode 题解/

54_二叉搜索树的第k大节点

·66 字·1 分钟

类型:树

  • 二叉搜索树的第k大节点 💚

    https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-di-kda-jie-dian-lcof/

    ❓ 给定一棵二叉搜索树,请找出其中第k大的节点。

    💡 中序遍历

    中序遍历后得到有序的数组,返回第倒数第 k 个元素即可。

    时间复杂度:O(n),空间复杂度:O(n)

    💡 反向中序遍历

    正常中序遍历的顺序是 左子树-根结点-右子树,我们可以把它反过来,右子树-根结点-左子树,这样得到的就是降序排列。我们可以提前返回。

    时间复杂度:O(n),当极端情况下树变成一棵只有左子树的链表时,我们需要访问所有元素。空间复杂度:O(n)

    💡 递归

    和反向中序遍历很像,只不过我们不保存遍历数组,只记录当前是反向中序遍历中的第几个元素。

    class Solution:
        def __init__(self):
            self.k = 0
            self.ans = None
    
        def kthLargest(self, root: TreeNode, k: int) -> int:
            if not root:
                return None
    
            if root.right:
                self.kthLargest(root.right, k)
            self.k += 1
            if self.k == k:
                self.ans = root.val
                return self.ans
            if root.left:
                self.kthLargest(root.left, k)
            return self.ans

    时间复杂度:O(n),当极端情况下树变成一棵只有左子树的链表时,我们需要访问所有元素。空间复杂度:O(n)