剑指 Offer 54. 二叉搜索树的第k大节点

题目描述

给定一棵二叉搜索树,请找出其中第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

限制:

1 ≤ k ≤ 二叉搜索树元素个数

解题思路

寻找二叉搜索树中的第k大元素,可以利用二叉搜索树的性质来做。二叉搜索树的中序遍历的结果是一个递增的有序序列,我们可以用count变量记录遍历的结点数量,然后在count==k的时候返回当前元素的值即可。

需要注意一点的是,如果按照左中右顺序遍历得到的是一个递增的序列,返回的是第k小的数;如果按照右中左的顺序遍历得到的是一个递减的序列,返回的是第k大的数。

具体的实现细节见代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int res=INT32_MIN;
void DFS(TreeNode* root,int k,int& count)
{
if(root==nullptr) return;
DFS(root->right,k,count);
count++;
if(count==k) res = root->val;
DFS(root->left,k,count);

}

int kthLargest(TreeNode* root, int k)
{
if(root==nullptr) return 0;
int count=0;
DFS(root,k,count);
return res;
}

时间复杂度为:O(n)O(n)nn为二叉树的结点个数

空间复杂度为:O(n)O(n)nn为二叉树的结点个数