1. 程式人生 > 其它 >力扣 - 劍指 Offer 54. 二叉搜尋樹的第k大節點

力扣 - 劍指 Offer 54. 二叉搜尋樹的第k大節點

題目

劍指 Offer 54. 二叉搜尋樹的第k大節點

思路1

  • 二叉搜尋樹的特性就是中序遍歷結果為遞增序列,而題目要求的是第 k 大節點,所以就應該是要遍歷結果為降序,
  • 按照先遍歷左子樹、輸出節點、遍歷右子樹得到的是升序結果,要得到降序,需要按照先遍歷右子樹、輸出節點、再遍歷左子樹即可
  • 什麼時候結束遞迴呢?有兩種情況:
    1. root 為 null 的時候,代表遍歷到葉子節點了,此時需要返回
    2. 當前節點為第 k 大節點:每遍歷到一個節點,將 k 值減1,直到 k 值為 0 ,說明找到第 k 大節點了,此時記錄下節點的值,然後開始返回

程式碼

class Solution {
    int k;
    int res;
    public int kthLargest(TreeNode root, int k) {
        this.k = k;
        dfs(root);
        return res;
    }

    public void dfs(TreeNode node) {
        if (node == null) {
            return;
        }

        dfs(node.right);
        k--;
        if (k == 0) {
            res = node.val;
            return;
        }
        dfs(node.left);
    }
}

複雜度分析

  • 時間複雜度:\(O(N)\)
  • 空間複雜度:\(O(N)\)
我走得很慢,但我從不後退!