每日一練(26):二叉搜尋樹的第k大節點

加班猿發表於2022-03-03

title: 每日一練(26):二叉搜尋樹的第k大節點

categories:[劍指offer]

tags:[每日一練]

date: 2022/02/25


每日一練(26):二叉搜尋樹的第k大節點

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

示例 1:

輸入: root = [3,1,4,null,2], k = 1

   3
  / \
 1   4
  \
   2

輸出: 4

示例 2:

輸入: root = [5,3,6,2,4,null,null,1], k = 3

       5
      / \
     3   6
    / \
   2   4
  /
 1

輸出: 4

限制:

1 ≤ k ≤ 二叉搜尋樹元素個數

來源:力扣(LeetCode)

連結:https://leetcode-cn.com/probl...

方法一:vector遞迴

class Solution {
public:
    vector<int> ans;
    void dfs(TreeNode* root) {
        if (!root) {
            return;
        }
        dfs(root->left);
        ans.push_back(root->val);
        dfs(root->right);
    }

    int kthLargest(TreeNode* root, int k) {
        dfs(root);
        return ans[ans.size() - k];
    }
};

方法二:變數遞迴

把原本是 “左中右” 的中序遍歷改成 “右中左” 的反向中序遍歷

維護兩個變數 count 和 res 即可。count 用來計數我們在降序的數字序列中走了幾位,當走了 k 位時,就讓 res 等於當前的 root -> val,然後退出 inorder 函式即可

class Solution {
public:
    // 二叉搜尋樹的中序遍歷是遞增序列 
    int  count, res;
    void dfs(TreeNode* root, int k){
        if (root == nullptr) {
            return;
        }
        dfs(root->right, k);
        count++;
        if (count == k) {
            res = root->val;
            return;
        }
        dfs(root->left, k);
    }

    int kthLargest(TreeNode* root, int k) {
        dfs(root, k);
        return res;
    }
};

相關文章