题目描述
给定一棵二叉搜索树,请找出其中第 $k$ 大的节点的值。
示例 1:
1 2 3 4 5 6 7
| 输入: root = [3,1,4,null,2], k = 1 3 / \ 1 4 \ 2 输出: 4
|
示例 2:
1 2 3 4 5 6 7 8 9
| 输入: root = [5,3,6,2,4,null,null,1], k = 3 5 / \ 3 6 / \ 2 4 / 1 输出: 4
|
限制:
算法
(二叉搜索树) $O(k)$
由于二叉搜索树的中序遍历是有序的,且是从小到大的,题目要求第 $k$ 大的值,那么可以反过来按照「右中左」的顺序遍历二叉搜索树,那么遍历到第 $k$ 个节点就是答案。
时间复杂度
最坏情况下的时间复杂度为 $O(n)$。
空间复杂度
$O(1)$
C++ 代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
|
class Solution { public: int res = 0; void dfs(TreeNode* root, int& k) { if (!k) return; if (!root) return; dfs(root->right, k); k -- ; if (!k) { res = root->val; return; } dfs(root->left, k); }
int kthLargest(TreeNode* root, int k) { if (!root) return 0; dfs(root, k); return res; } };
|