题解利用了二叉搜索树的性质,即其中序遍历结果是递增序列。要找第 cnt 大的元素,可以进行一种反向中序遍历(即先访问右子树,再访问根,最后访问左子树)。这样第 cnt 次访问的节点就是第 cnt 大的节点。解题关键在于通过计数器 self.k 来记录访问的元素数,当计数器减到0时,当前节点即为所求的第 cnt 大的元素。
时间复杂度: O(n)
空间复杂度: O(n)
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
k = None
res = None
def kthLargest(self, root: TreeNode, k: int) -> int:
self.k = k # 初始化计数器
def dfs(root):
if root is None: # 如果节点为空,返回
return
dfs(root.right) # 首先访问右子节点
if self.k == 0: # 如果计数器为0,提前结束
return
self.k -= 1 # 访问一个节点,计数器减1
if self.k == 0: # 如果计数器减到0,当前节点即为所求
self.res = root.val
dfs(root.left) # 最后访问左子节点
dfs(root) # 开始递归
return self.res # 返回结果