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

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

题解

  • 我们都知道二叉搜索树的性质:中序遍历(根左右)后得到是从小到大的顺序 ;
  • 同理我们采用中序遍历(根右左)得到的是从大到小的顺序 ;
  • 我们在中序遍历二叉树的过程中维护一个数组,将遍历的值保存下来
  • 由于是从1开始第k大,就遍历数组输出第k个元素即可
 /*
    根左右得出从小到大的顺序 ;
    根右左得出从大到小的顺序
 */
class Solution {
public:
    int kthLargest(TreeNode* root, int k) {
        vector<int> res = {0} ;
        inorder(root,res) ;
        for(int i =1 ; i < res.size() ; i ++){
            cout << res[i] << " " ;
            if(i == k) return res[i] ;
        }
        return 0 ;

    }
    void inorder(TreeNode * root , vector<int> &res){
        if (!root) return;
        inorder(root->right, res);
        res.push_back(root->val);
        inorder(root->left, res);

    }
};
posted @ 2022-01-23 20:35  爪洼ing  阅读(25)  评论(0编辑  收藏  举报