题目描述
解法
这道题最重要的是利用二叉搜索树(二叉树本身不具备这个性质)本身的性质:
二叉排序树或者是一棵空树,或者是具有下列性质的二叉树:
(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
(2)若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值;
(3)左、右子树也分别为二叉排序树;
(4)没有键值相等的节点。
注意:左子树上所有结点的值均小于它的根结点的值
所以二叉搜索树中序遍历(左子树->根节点->右子树)是一个递增的数列。反之,右子树,根节点,左子树的遍历是递减的数列。
因此先写一个二叉树的中序遍历,而后利用 类内全局变量来维护k和第k大的value 这点非常重要,刚开始一直在这一点出错,所以没能跑通。
class Solution:
def kthLargest(self, root: TreeNode, k: int) -> int:
def dfs(root):
if root is None:
return None
if self.k > 0:
dfs(root.right)
self.k = self.k - 1 #设置类内全局变量的更改
if self.k == 0:
self.value = root.val #把value赋值到类内全局变量
if self.k >= 0:
dfs(root.left)
self.k = k
dfs(root)
return self.value
思考感想
主要就是类内全局变量的维护,还有二叉树的基本性质。