类型:树
-
二叉搜索树的第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)