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;
}
};