首页 > 编程语言 >#yyds干货盘点# LeetCode程序员面试金典:二叉搜索树中第K小的元素

#yyds干货盘点# LeetCode程序员面试金典:二叉搜索树中第K小的元素

时间:2023-09-14 23:32:13浏览次数:45  
标签:node yyds TreeNode int root nodeNum 金典 树中 left

题目:

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

 

示例 1:

#yyds干货盘点# LeetCode程序员面试金典:二叉搜索树中第K小的元素_二叉搜索树

输入:root = [3,1,4,null,2], k = 1
输出:1

示例 2:

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

代码实现:

class Solution {
    public int kthSmallest(TreeNode root, int k) {
        MyBst bst = new MyBst(root);
        return bst.kthSmallest(k);
    }
}

class MyBst {
    TreeNode root;
    Map<TreeNode, Integer> nodeNum;

    public MyBst(TreeNode root) {
        this.root = root;
        this.nodeNum = new HashMap<TreeNode, Integer>();
        countNodeNum(root);
    }

    // 返回二叉搜索树中第k小的元素
    public int kthSmallest(int k) {
        TreeNode node = root;
        while (node != null) {
            int left = getNodeNum(node.left);
            if (left < k - 1) {
                node = node.right;
                k -= left + 1;
            } else if (left == k - 1) {
                break;
            } else {
                node = node.left;
            }
        }
        return node.val;
    }

    // 统计以node为根结点的子树的结点数
    private int countNodeNum(TreeNode node) {
        if (node == null) {
            return 0;
        }
        nodeNum.put(node, 1 + countNodeNum(node.left) + countNodeNum(node.right));
        return nodeNum.get(node);
    }

    // 获取以node为根结点的子树的结点数
    private int getNodeNum(TreeNode node) {
        return nodeNum.getOrDefault(node, 0);
    }
}

标签:node,yyds,TreeNode,int,root,nodeNum,金典,树中,left
From: https://blog.51cto.com/u_13321676/7475567

相关文章

  • #yyds干货盘点#SQL注入之布尔注入原理
    布尔注入定义及原理:所谓盲注就是在服务器没有错误回显的时候完成注入公鸡。盲注分为布尔盲注和时间盲注布尔盲注:boolean根据注入信息返回trueorfales没有任何报错信息时间盲注:界面返回值ture无论输入任何值,返回的情况都是正常的来处。加入特定的时间函数,通过查看web页面返回......
  • #yyds干货盘点#Koa源码浅析
    Koa源码十分精简,只有不到2k行的代码,总共由4个模块文件组成,非常适合我们来学习。我们先来看段原生Node实现Server服务器的代码:consthttp=require('http');constserver=http.createServer((req,res)=>{res.writeHead(200);res.end('helloworld');});server.list......
  • # yyds干货盘点 #通过pandas读取xls文件(pd.read_excel)系统提示:no engine?
    大家好,我是皮皮。一、前言前几天在Python最强王者群【wen】问了一个Python自动化办公的问题,一起来看看吧。通过pandas读取xls文件(pd.read_excel)系统提示:noengineforfiletyppexls,请问应该如何处理呢?二、实现过程后来【隔壁......
  • #yyds干货盘点# LeetCode程序员面试金典:基本计算器 II
    题目:给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。整数除法仅保留整数部分。你可以假设给定的表达式总是有效的。所有中间结果将在 [-231,231 -1] 的范围内。注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval() 。 示例1:输入:s=......
  • #yyds干货盘点# LeetCode程序员面试金典:字符串相加
    1.简述:给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和并同样以字符串形式返回。你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。 示例1:输入:num1="11",num2="123"输出:"134"示例2:输入:num1="456",num2=......
  • #yyds干货盘点#Linux系统sensors命令 – 检测服务器硬件信息
    sensors命令用于检测服务器硬件信息,例如CPU电压与温度、主板、风扇转速等数据。语法格式 :sensors参考实例检查当前CPU处理器得电压和温度信息[root@linuxcool~]#sensorscoretemp-isa-0000Core0:+48.0°C(high=+87.0°C,crit=+97.0°C)Core1:+46.0......
  • # yyds干货盘点 # Python判断多个文件夹的文件夹名是否包含“分公司”或“营销中心”
    大家好,我是皮皮。一、前言前几天在Python最强王者群【哎呦喂 是豆子~】问了一个Python自动化办公的问题,一起来看看吧。大佬们请问下 判断多个文件夹的文件夹名是否包含“分公司”或“营销中心” 有没有什么简便的办法可以实现呀?二、实现过程这里【东哥】给了两个示例代码,实现......
  • #yyds干货盘点# LeetCode程序员面试金典:翻转二叉树
    题目:给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 示例1:输入:root=[4,2,7,1,3,6,9]输出:[4,7,2,9,6,3,1]示例2:输入:root=[2,1,3]输出:[2,3,1]示例3:输入:root=[]输出:[]代码实现:classSolution{publicTreeNodeinvertTree(TreeNoderoot){......
  • #yyds干货盘点# LeetCode程序员面试金典:第三大的数
    1.简述:给你一个非空数组,返回此数组中 第三大的数 。如果不存在,则返回数组中最大的数。 示例1:输入:[3,2,1]输出:1解释:第三大的数是1。示例2:输入:[1,2]输出:2解释:第三大的数不存在,所以返回最大的数2。示例3:输入:[2,2,3,1]输出:1解释:注意,要求返回第三大的数,是指在所......
  • 代码随想录:● 654.最大二叉树 ● 617.合并二叉树 ● 700.二叉搜索树中的搜索 ● 98
     654.最大二叉树 给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下:二叉树的根是数组中的最大元素。左子树是通过数组中最大值左边部分构造出的最大二叉树。右子树是通过数组中最大值右边部分构造出的最大二叉树。通过给定的数组构建最大二叉树,并且输出这个......