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

2021年5月30日 72Browse 1Like 0Comments

题目描述

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

解题思路

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

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

具体的实现细节见代码:

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)$,$n$为二叉树的结点个数

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

agedcat_xuanzai

这个人很懒,什么都没留下

Comments