【剑指Offer-54】二叉搜索树的第k大节点
问题
给定一棵二叉搜索树,请找出其中第k大的节点。
解答1:递归
class Solution {
public:
int kthLargest(TreeNode* root, int k) {
if (!root || flag) return res; // 使用flag跳出递归
kthLargest(root->right, k);
if (++cnt == k) {
res = root->val;
flag = 1;
}
kthLargest(root->left, k);
return res;
}
private:
int cnt = 0, res = -1, flag = 0;
};
重点思路
中序遍历二叉搜索树可以得到递增序列。遍历到第k
个时跳出所有递归,这里使用一个flag
实现。注意,这里求的是第k
大节点,所以中序要反向。
解答2:迭代
class Solution {
public:
int kthLargest(TreeNode* root, int k) {
stack<TreeNode*> s;
TreeNode* cur = root;
while (!s.empty() || cur) {
while (cur) {
s.push(cur);
cur = cur->right;
}
cur = s.top(); s.pop();
if (--k == 0) return cur->val; // 中序操作
cur = cur->left;
}
return -1;
}
};