我是靠谱客的博主 如意小伙,最近开发中收集的这篇文章主要介绍leetcode 230. 二叉搜索树中第K小的元素  mediumleetcode 230. 二叉搜索树中第K小的元素  medium          题目描述:,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

leetcode 230. 二叉搜索树中第K小的元素  medium          

题目描述:

给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 个最小的元素。

说明:
你可以假设 k 总是有效的,1 ≤ k ≤ 二叉搜索树元素个数。

进阶:
如果二叉搜索树经常被修改(插入/删除操作)并且你需要频繁地查找第 k 小的值,你将如何优化 kthSmallest 函数?

解题思路:

普通解法: bst的中序(左中右)是一个递增序列,所以只要中序遍历,并且计数,到第k个,输出就objk了。

进阶问题: 只要修改原树结点的结构,使其保存包括当前结点和其左右子树所有结点的个数,这样我们就可以用递归的方法快速定位到第k小的节点了。

具体的方法是

如果当前节点的左子树节点数大于等于k,去左子树找第k个

如果左子树的节点数等于k-1,返回当前节点

如果左子树的节点数a小于k-1,去右子树找它的第 k-(a+1)个节点。

代码:

普通解法:

/**
 * 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 kthSmallest(TreeNode* root, int k) {
        if(root ==nullptr)
            return -1;
        stack<TreeNode *> sta;
        TreeNode *cur=root;
        while(cur || sta.size()){
            while(cur){
                sta.push(cur);
                cur=cur->left;
            }
            
            if(!sta.empty()){
                cur=sta.top();
                sta.pop();
                --k;
                if(k==0) return cur->val;
                cur=cur->right;
                
            }
        }
        
        return -1;
    }
};

递归解法:

/**
 * 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 kthSmallest(TreeNode* root, int k) {
        if(!root)
            return -1;
        int a=size(root->left);
        if(a>=k) return kthSmallest(root->left,k);
        else if(a==k-1) return root->val;
        else return kthSmallest(root->right,k-(a+1));
    }
    
    
    int size(TreeNode *root){
        if(!root)
            return 0;
        return 1+size(root->left)+size(root->right);
    }
    
};

 

最后

以上就是如意小伙为你收集整理的leetcode 230. 二叉搜索树中第K小的元素  mediumleetcode 230. 二叉搜索树中第K小的元素  medium          题目描述:的全部内容,希望文章能够帮你解决leetcode 230. 二叉搜索树中第K小的元素  mediumleetcode 230. 二叉搜索树中第K小的元素  medium          题目描述:所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(41)

评论列表共有 0 条评论

立即
投稿
返回
顶部