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

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

题目描述

给定一棵二叉搜索树,请找出其中第 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

限制:

  • 1 ≤ k ≤ 二叉搜索树元素个数

解法一:反向中序遍历

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func kthLargest(root *TreeNode, k int) int {
    var inorder func(root *TreeNode)
    var ans *TreeNode
    inorder = func(root *TreeNode) {
        if nil == root {
            return
        }
        inorder(root.Right)
        k--
        if k == 0 {
            ans = root
        }
        inorder(root.Left)
    }
    inorder(root)
    return ans.Val
}

加上剪枝操作后的代码如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
func kthLargest(root *TreeNode, k int) int {
    var res int
    var inorder func(root *TreeNode)
    inorder = func(root*TreeNode) {
        if nil == root || 0 == k {
            return
        }
        inorder(root.Right)
        k--
        if 0 == k {
            res = root.Val
        }
        inorder(root.Left)
    }
    inorder(root)
    return res
}
Licensed under CC BY-NC-SA 4.0
最后更新于 2023/06/17 22:17:00
comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计