1. 题目来源
链接:二叉搜索树的第k大节点
来源:LeetCode——《剑指-Offer》专项
2. 题目说明
给定一棵二叉搜索树,请找出其中第 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 ≤ 二叉搜索树元素个数
3. 题目解析
方法一:中序遍历+常规解法
BST
的重要性质:中序遍历为降序有序序列。所以只需要修改下中序遍历,先遍历右子树再遍历左子树,即可得到升序序列。在递归中添加截断条件, 提高效率。
是一道基础问题,但是这两点必须全部考虑到才算是最优解,并且可以考虑迭代形式的写法。
参见代码如下:
// 执行用时 :20 ms, 在所有 C++ 提交中击败了89.38%的用户
// 内存消耗 :26.7 MB, 在所有 C++ 提交中击败了100.00%的用户
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int res = 0, cnt = 0;
int kthLargest(TreeNode* root, int k) {
help(root, k);
return res;
}
void help(TreeNode* root, int k) {
if (root == nullptr) return;
if (root->right != nullptr) help(root->right, k);
++cnt;
if (cnt == k) res = root->val;
if (root->left != nullptr) help(root->left, k);
return;
}
};