📅  最后修改于: 2023-12-03 15:37:46.274000             🧑  作者: Mango
在二叉搜索树中,节点的值满足左子树的节点值小于等于该节点,右子树的节点值大于等于该节点。因此,可以通过中序遍历二叉搜索树得到一个有序的节点值序列。
本题可以先中序遍历该二叉搜索树得到一个有序的节点值序列,然后返回倒数第 K 个节点的值即可。
以下是基于递归中序遍历实现的 Python 代码片段:
class Solution:
def __init__(self):
self.rank = 0
self.res = 0
def kthLargest(self, root: TreeNode, k: int) -> int:
self.inorder(root, k)
return self.res
def inorder(self, root, k):
if not root:
return
self.inorder(root.right, k)
self.rank += 1
if self.rank == k:
self.res = root.val
return
self.inorder(root.left, k)
首先,构造一个 Solution 类,其中包含两个成员变量 self.rank 和 self.res。
使用 self.inorder 函数递归遍历二叉搜索树,其中,先递归遍历右子树,再进行一些处理,最后递归遍历左子树。递归到某个节点时,先递归遍历右子树,这样在有序的节点值序列中,当前节点的值及其右边的所有节点的值均不会被遍历到。对于每个遍历到的节点,记录当前是第几个遍历到的节点(即第几大),若当前节点是第 K 大的节点,则将其值赋给 self.res,并返回。
得到了第 K 大的节点的值,就能通过函数返回该值。
以上代码时间复杂度为 O(N),其中 N 表示二叉搜索树的节点数。