【面试题54 二叉搜索树的第k大节点】
给定一棵二叉搜索树,请找出其中第k大的节点。
Leetcode题目对应位置: 面试题54:二叉搜索树的第k大节点
思路:二叉搜索树本身有序,中序遍历的结果就是递增序列,而题目中要求第 k 大,明显是需要一个递减序列,所以将中序遍历改为 “右根左”,就得到的是递减序列啦。用一个列表存储递减序列,最后直接返回第 k-1 个数即可(因为下标从 0 开始)。
时间复杂度:
O
(
n
)
O(n)
O(n),最坏情况下,二叉树退化为链表,递归深度为 n
空间复杂度:
O
(
2
n
)
O(2n)
O(2n),最坏情况下,二叉树退化为链表,需要 O(n) 的栈空间;另外还需要一个大小为 O(n) 的数组存放有序序列
class Solution:
def kthLargest(self, root: TreeNode, k: int) -> int:
if not root: return
nums = []
def dfs(root):
if not root: return
dfs(root.right) # 右
nums.append(root.val) # 根
dfs(root.left) # 左
dfs(root)
return nums[k-1]
优化空间,其实也没必要用数组存的啦,直接用一个滚动变量就好了,每找到一个当前最大的数,就将 k 减 1,直到 k 为 0 时表示这就是要找的第 k 大的数。
时间复杂度:
O
(
n
)
O(n)
O(n),最坏情况下,二叉树退化为链表,递归深度为 n
空间复杂度:
O
(
2
n
)
O(2n)
O(2n),最坏情况下,二叉树退化为链表,需要 O(n) 的栈空间
class Solution:
def kthLargest(self, root: TreeNode, k: int) -> int:
if not root: return
def dfs(root):
if not root: return
dfs(root.right)
if self.k == 0: return
self.k -= 1
if self.k == 0: self.res = root.val
dfs(root.left)
self.k = k
dfs(root)
return self.res