Leetcode刷題:劍指offer【面試題54 二叉搜索樹的第k大節點 】

【面試題54 二叉搜索樹的第k大節點】

給定一棵二叉搜索樹,請找出其中第k大的節點。

Leetcode題目對應位置: 面試題54:二叉搜索樹的第k大節點

思路:二叉搜索樹本身有序,中序遍歷的結果就是遞增序列,而題目中要求第 k 大,明顯是需要一個遞減序列,所以將中序遍歷改爲 “右根左”,就得到的是遞減序列啦。用一個列表存儲遞減序列,最後直接返回第 k-1 個數即可(因爲下標從 0 開始)。

時間複雜度O(n)O(n),最壞情況下,二叉樹退化爲鏈表,遞歸深度爲 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),最壞情況下,二叉樹退化爲鏈表,遞歸深度爲 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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章