每天一道leetcode:剑指 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 ≤ 二叉搜索树元素个数

题目思路

根据二叉搜索树的性质,每次插入时,比我小的放在我的左边,比我大的放在我的右边,所以对于每个根节点,都有左孩子比我小、右孩子比我大,故反过来的中序遍历,也就是右->中->左可以实现从大到小遍历二叉搜索树的每个节点。

注意:传入的k一定是传的引用,否则自减不起作用。

代码

/**
 * 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 ans=0;

    void order(TreeNode* root,int& k)//注意,这里一定用引用
    {
        if(root==NULL||k<=0) return;
        //右
        order(root->right,k);
        //中
        if(--k==0)
        {
            ans=root->val;
            return;
        }
        //左
        order(root->left,k);
    }

    int kthLargest(TreeNode* root, int k) 
    {
        order(root,k);
        return ans;
    }
};

提交结果

每天一道leetcode:剑指 Offer 54. 二叉搜索树的第k大节点(适合初学者&二叉搜索树)_第1张图片

 欢迎大家在评论区讨论,如有不懂的代码部分,欢迎在评论区留言!

你可能感兴趣的:(剑指Offer,leetcode,算法,职场和发展,数据结构,图论)