《剑指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 ≤ 二叉搜索树元素个数

代码

这道题考察了二叉搜索树的性质,按照右->根->左的顺序搜索,得到的序列为从大到小,如果按照左->根->右,得到的序列顺序为从小到大:

/**
 * 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 kthLargest(TreeNode* root, int k) {
        vector<int> ans;
        inorder(root,k,ans);
        return ans[k-1];
    }
    void inorder(TreeNode* root,int k,vector<int>&ans)
    {
        if(ans.size() == k)
            return;
        if(root->right)inorder(root->right,k,ans);
        ans.push_back(root->val);
        if(root->left)inorder(root->left,k,ans);
    }
};

结果

执行用时 :32 ms, 在所有 C++ 提交中击败了47.36%的用户
内存消耗 :24.5 MB, 在所有 C++ 提交中击败了100.00%的用户

代码2

/**
 * 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 kthLargest(TreeNode* root, int k) {
        int ans;
        inorder(root,k,ans);
        return ans;
    }
    void inorder(TreeNode* root,int& k,int &ans)
    {       
        if(root->right && k > 0)inorder(root->right,k,ans);
        if(--k == 0){
            ans = root->val;
            return;
        }
        if(root->left && k>0)inorder(root->left,k,ans);
    }
};

结果:

执行用时 :28 ms, 在所有 C++ 提交中击败了64.14%的用户
内存消耗 :24.1 MB, 在所有 C++ 提交中击败了100.00%的用户
posted @ 2020-04-24 08:44  曲径通霄  阅读(136)  评论(0编辑  收藏  举报