【面試題54 二叉搜索樹的第k大節點】
給定一棵二叉搜索樹,請找出其中第k大的節點。
Leetcode題目對應位置: 面試題54:二叉搜索樹的第k大節點
思路:二叉搜索樹本身有序,中序遍歷的結果就是遞增序列,而題目中要求第 k 大,明顯是需要一個遞減序列,所以將中序遍歷改爲 “右根左”,就得到的是遞減序列啦。用一個列表存儲遞減序列,最後直接返回第 k-1 個數即可(因爲下標從 0 開始)。
時間複雜度:,最壞情況下,二叉樹退化爲鏈表,遞歸深度爲 n
空間複雜度:,最壞情況下,二叉樹退化爲鏈表,需要 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 大的數。
時間複雜度:,最壞情況下,二叉樹退化爲鏈表,遞歸深度爲 n
空間複雜度:,最壞情況下,二叉樹退化爲鏈表,需要 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