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;
        }
    }
}
相关推荐
CodeStride3 分钟前
就像长跑配速一样,我是如何平衡代码性能与可读性的
java
旋律翼29 分钟前
Qt Bridges for C# 深度技术解析
开发语言·qt·c#
弹简特15 分钟前
【Java项目-企悦抽】07-用户与认证模块-实现用户注册01
java·开发语言
L歪歪君15 分钟前
Apache Doris全链路性能优化实战指南:从架构设计到生产落地
java·开发语言·算法
m0_4665252926 分钟前
从“算法内卷”到“可信易用” 东软多模态医学人工智能平台开启无代码科研新时代
人工智能·算法
山东点狮信息科技有限公司32 分钟前
SpringBoot+VUE3,一套系统完成OA+HRM+CRM+MES+合同+项目管理 —— 深度解析点狮全业务管理平台
java·spring boot·后端
你怎么知道我是队长40 分钟前
JavaScript 的控制语句介绍
开发语言·javascript·ecmascript
码少女1 小时前
数据结构——冒泡排序及优化
数据结构·算法·排序算法
艾莉丝努力练剑1 小时前
【AI面试】AI八股文
人工智能·ai·面试·langchain·八股文
梦回江东1 小时前
ansible中的主机清单
算法