方法1:二叉搜索树的性质,中序遍历左中右是升序的;使用中序遍历的变形,右中左,则第k个数就是第k大节点
class Solution:
def kthLargest(self, root: TreeNode, k: int) -> int:
res = []
stack =[]
while stack or root:
while root:
stack.append(root)
root = root.right
tmp=stack.pop()
res.append(tmp.val)
k -=1
if k==0:
return res[-1]
root = tmp.left#注意无论是不是变体,访问完左节点再去访问右节点,是以tmp为主节点的,毕竟tmp是当前的节点
时间复杂度O(k)只遍历了k个节点
空间复杂度O(h)h表示树的高度,也即递归的栈的消耗
莫里斯遍历,在中序版的莫里斯遍历基础上更改,1,是right和left互换,2,是将k不断-1
class Solution:
def kthLargest(self, root: TreeNode, k: int) -> int:
node, output = root, []
while node:
if not node.right: #当前节点没有you子节点
output.append(node.val)#
k -=1##
if k==0:##
return node.val##
node = node.left
else: #当前节点有you子节点
predecessor = node.right
while predecessor.left and predecessor.left is not node:
predecessor = predecessor.left
if not predecessor.left:#建立联系,找到了最zuo节点
predecessor.left = node #建立zuo关系,与初始节点
node = node.right #初始节点建立关系后,继续其you节点作为初始节点
else:#拆除联系
output.append(node.val)
k -=1##
if k==0:##
return node.val##
predecessor.left = None
node = node.left
时间复杂度O(k),需要遍历k个节点,空间复杂度O(1)