LeetCode--HOT100题(44)

目录

  • [题目描述:230. 二叉搜索树中第K小的元素(中等)](#题目描述:230. 二叉搜索树中第K小的元素(中等))
  • PS:

题目描述:230. 二叉搜索树中第K小的元素(中等)

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

LeetCode做题链接:LeetCode-两数之和

示例 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 {
    public int kthSmallest(TreeNode root, int k) {
    
    }
}

解题思路

  1. 创建一个ArrayList用于存储中序遍历的结果。中序遍历是一种二叉树的遍历方式,顺序为左子树-根节点-右子树。这种遍历方式可以得到一个升序的序列。
  2. 定义一个方法kthSmallest,输入参数为二叉树的根节点和整数k,返回二叉树中第k小的元素。在这个方法中,首先调用dfs方法对二叉树进行中序遍历,将结果存储在list中。然后返回list中第k-1个元素,因为数组下标从0开始,而题目要求的k是从1开始的。
  3. 定义一个方法dfs,输入参数为二叉树的节点,递归地对该节点的左子树和右子树进行中序遍历。在这个方法中,首先判断当前节点是否为空,如果为空则直接返回。然后递归地对左子树进行中序遍历,将遍历得到的结果存储在list中。接着将当前节点的值添加到list中,最后递归地对右子树进行中序遍历。

通过这种方式,我们可以在O(n)的时间复杂度内找到二叉搜索树中第k小的元素,其中n是二叉树的节点数。

代码

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 {
    // 创建一个ArrayList用于存储中序遍历的结果
	ArrayList<Integer> list = new ArrayList<>();
	
	// 定义一个方法,输入参数为二叉树的根节点和整数k,返回二叉树中第k小的元素
	public int kthSmallest(TreeNode root, int k) {
	    // 先对二叉树进行中序遍历,将结果存储在list中
	    dfs(root);
	    // 返回list中第k-1个元素,因为数组下标从0开始,而题目要求的k是从1开始的
	    return list.get(k - 1);
	}
	
	// 定义一个方法,输入参数为二叉树的节点,递归地对该节点的左子树和右子树进行中序遍历
	public void dfs(TreeNode root) {
	    // 如果当前节点为空,直接返回
	    if (root == null) {
	        return;
	    }
	    // 递归地对左子树进行中序遍历
	    dfs(root.left);
	    // 将当前节点的值添加到list中
	    list.add(root.val);
	    // 递归地对右子树进行中序遍历
	    dfs(root.right);
	}
}

PS:

感谢您的阅读!如果您觉得本篇文章对您有所帮助,请给予博主一个喔~

相关推荐
pwn蒸鱼4 分钟前
leetcode:92. 反转链表 II
算法·leetcode·链表
深念Y8 分钟前
Harness Engineering:我的HomeSense Agent 架构演进
人工智能·算法·架构·智能家居·agent·小爱同学·harness
Imxyk10 分钟前
P9244 [蓝桥杯 2023 省 B] 子串简写
数据结构·c++·算法
colus_SEU12 分钟前
SVM 面试题总结
算法·机器学习·支持向量机
INGNIGHT13 分钟前
373. 查找和最小的 k 对数字(堆priority_queue)
算法
ambition2024216 分钟前
深度优先搜索(DFS)与回溯算法详解:以全排列问题为例
算法·深度优先
Omics Pro16 分钟前
马普所:生命蛋白质宇宙聚类
数据库·人工智能·算法·机器学习·数据挖掘·aigc·聚类
汀、人工智能17 分钟前
[特殊字符] 第106课:旋转图像
数据结构·算法·矩阵·数据库架构·数组·旋转图像
ulias21221 分钟前
leetcode热题 - 2
算法·leetcode·职场和发展
Ivanqhz22 分钟前
SMT(Satisfiability Modulo Theories,基于模理论的可满足性)
人工智能·算法·机器学习