题解
前置知识
- 二叉查找树(Binary Search Tree,又:二叉搜索树,二叉排序树),它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。二叉搜索树作为一种经典的数据结构,它既有链表的快速插入与删除操作的特点,又有数组快速查找的优势;所以应用十分广泛,例如在文件系统和数据库系统一般会采用这种数据结构进行高效率的排序与检索操作。
- 二叉搜索树性质1:树中的值左小右大
- 二叉搜索树性质2:二叉搜索树的中序遍历(左、根、右)为递增序列
思路
- 根据上述二叉搜索树性质,易得二叉搜索树的中序遍历倒序为递减序列。
- 因此,求 “二叉搜索树第 kk 大的节点” 可转化为求 “此树的中序遍历倒序的第 k 个节点”。
方法
python
# Definition for a binary tree node.
class TreeNode(object):
def __init__(self, x):
self.val = x
self.left = None
self.right = None
class Solution(object):
def kthLargest(self, root, k):
"""
:type root: TreeNode
:type k: int
:rtype: int
"""
def dfs(root):
# 终止条件:遇到叶子结点(None),则返回(由题中的定义而来)
if not root:
return
# 递进过程1:右子树
dfs(root.right) # 因为需要求第K大的数,则应从右子树开始(二叉搜索树:左小右大)
self.k -= 1 # 每遇到一个数,则k减一;直至减为0,即求得第k大的值
if self.k == 0:
self.res = root.val
# 递进过程2:左子树
dfs(root.left)
self.k = k # 维护一个全局变量
dfs(root)
return self.res