Leecode热题100-230.二叉搜索树中的第k小的节点

给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k小的元素(从 1 开始计数)。

示例 1:

复制代码
输入:root = [3,1,4,null,2], k = 1
输出:1

示例 2:

复制代码
输入:root = [5,3,6,2,4,null,null,1], k = 3
输出:3

提示:

  • 树中的节点数为 n
  • 1 <= k <= n <= 104
  • 0 <= Node.val <= 104

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

我写的是比较容易想的解法,时间复杂度不一定是最好的,能过就行吧

java 复制代码
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    /**本题使用二叉树的递归套路进行解题,我们需要知道的是左树有多少个节点和右树有多少个节点,这个信息我们定义为info
    然后分别得到左右树这个信息,综合成当前树的信息*/
    public int kthSmallest(TreeNode root, int k) {
        /**获取当前树的info信息 */
        Info info = getInfo(root);
        /**如果左子树的节点数大于等于k了,说明第k大的在左树上,到左树去找 */
        if(info.leftNodes >= k) {
            return kthSmallest(root.left, k);
            /**如果左树节点数+1=k,说明root是第k大的 */
        } else if(info.leftNodes + 1 == k) {
            return root.val;
        } else {
            /**否则到右树上去找,因为左树和根已经有info.leftNodes+1个节点了,所以这里是到右树上找第k - info.leftNodes - 1 */
            return kthSmallest(root.right, k - info.leftNodes - 1);
        }
    }
    /**获取某个节点的Info信息 */
    public Info getInfo(TreeNode root) {
        /**本身是null,info就是null */
        if(root == null) {
            return null;
        }
        /**如果它不为null但是左右孩子都是null,就返回new Info(0,0)*/
        if(root.left == null && root.right == null) {
            return new Info(0,0);
        }
        /**获取左右子树的信息 */
        Info leftInfo = getInfo(root.left);
        Info rightInfo = getInfo(root.right);
        /**根据左右子树的信息获取当前树的info信息 */
        int leftNodes = (leftInfo == null? 0 : leftInfo.leftNodes + leftInfo.rightNodes + 1);
        int rightNodes = (rightInfo == null? 0 : rightInfo.leftNodes + rightInfo.rightNodes + 1);
        return new Info(leftNodes, rightNodes);
    }

    static class Info {
        int leftNodes;
        int rightNodes;
        public Info(int leftNodes, int rightNodes) {
            this.leftNodes = leftNodes;
            this.rightNodes = rightNodes;
        }
    }
}
相关推荐
郝学胜-神的一滴4 分钟前
中级OpenGL教程 013:渲染器类架构设计与逐帧渲染流程详解
开发语言·c++·unity·游戏引擎·图形渲染·opengl·unreal
在书中成长10 分钟前
HarmonyOS 小游戏《对战五子棋》开发第18篇 - 棋盘设计
算法·harmonyos
Frostnova丶18 分钟前
(12)LeetCode 76. 最小覆盖子串
算法·leetcode·职场和发展
淘源码d31 分钟前
医学影像云PACS系统——PACS诊断工作站
java·源码·影像处理·医院管理系统·影像工作站·云pacs系统·dicom 标准通信
灯澜忆梦37 分钟前
GO_函数_1
算法
小七在进步1 小时前
数据结构:栈与队列之栈的实现
数据结构
言乐61 小时前
Python实现建造微服务商城后台
开发语言·python·算法·微服务·架构
NiceCloud喜云1 小时前
Anthropic 一周三连发:Cowork 多端、Fable 5 按需付费、J-space 论文的技术解读
java·服务器·网络·人工智能·ai
凉云生烟1 小时前
机器学习 02- KNN算法
人工智能·算法·机器学习
wabs6661 小时前
关于动态规划【力扣583.两个字符串的删除操作的思考】
算法·leetcode·动态规划