0x00 题目
给定一棵 二叉搜索树
请找出其中第 k 大的节点
0x01 思路
一提到 二叉搜索树
就应该习惯性地想到:中序遍历
其结果是:一个 升序 数组
题目要求:找出其中第 k 大的节点
先不看 k 是多少
如果让你找出 最大 的节点,你如何找呢?
先看看 中序 遍历的顺序:
左中右
其 值 的顺序是:
小中大
按照一般的做法,要全部遍历完,才能找到最大值
如果调换一下遍历顺序:
右中左
你是否能明白?这其中的道理?
左中右 的顺序:是从 最小 的开始找
右中左 的顺序:是从 最大 的开始找
get or not ?
0x02 解法
语言:Swift
树节点:TreeNode
public class TreeNode {
public var val: Int
public var left: TreeNode?
public var right: TreeNode?
public init() { self.val = 0; self.left = nil; self.right = nil; }
public init(_ val: Int) { self.val = val; self.left = nil; self.right = nil; }
public init(_ val: Int, _ left: TreeNode?, _ right: TreeNode?) {
self.val = val
self.left = left
self.right = right
}
}
解法:
func kthLargest(_ root: TreeNode?, _ k: Int) -> Int {
// 记录第 k 大的值
var kth = 0
// 记录 k 的位置,从最后往前推算,为 0 时说明找到
var i = k
func dfs(_ root: TreeNode?) {
if root == nil { return }
// 从最右侧节点开始找
dfs(root?.right)
// 中序遍历位置
// 为 0,表示已找到
if i == 0 {
return
}
// 从最大值依次往前找
i -= 1
// 为 0,记录当前节点值
if i == 0 {
kth = root!.val
}
// 最后往左子树找
dfs(root?.left)
}
dfs(root)
return kth
}
0x03 我的小作品
欢迎体验我的作品之一:小五笔
五笔学习好帮手!
App Store 搜索即可~
经典的 86 版
当然还有 98 版
苹果 iOS 14 已经自带 五笔输入法 了