剑指 Offer 54. 二叉搜索树的第k大节点

366 阅读1分钟

题目描述

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

示例 1:
输入: root = [3,1,4,null,2], k = 1
   3
  / \
 1   4
  \
   2
输出: 4

示例 2:
输入: root = [5,3,6,2,4,null,null,1], k = 3
       5
      / \
     3   6
    / \
   2   4
  /
 1
输出: 4

解题思路: DFS+中序遍历

  1. 因为题目是二叉搜索树, 可以根据二叉搜索树的中序遍历是一个有序的序列来考虑.
  2. 因为是求最大的第K个, 所以我们可以先用" 右 根 左" 的顺序来遍历, 就是一个倒序的序列.
  3. 我们在进行中序遍历时, 根据K值记录中序的次数, 当K为0时, 此时遍历到的中序值就是第K大的节点

示例代码

def kthLargest(self, root: TreeNode, k: int) -> int:
    def dfs(root):
        if not root:
            return
        dfs(root.right) # 中序遍历右节点

        if self.k == 0: # K的判断
            return

        self.k -= 1
        if self.k == 0:
            self.res = root.val
        dfs(root.left) # 中序遍历左节点

    self.k = k
    self.res = 0
    dfs(root)
    return self.res