2022-02-02:最接近的二叉搜索树值 II。
给定一个不为空的二叉搜索树和一个目标值 target,请在该二叉搜索树中找到最接近目标值 target 的 k 个值。
注意:
给定的目标值 target 是一个浮点数,
你可以默认 k 值永远是有效的,即 k ≤ 总结点数,
题目保证该二叉搜索树中只会存在一种 k 个值集合最接近目标值。
拓展:
假设该二叉搜索树是平衡的,请问您是否能在小于 O(n)(n 为总结点数)的时间复杂度内解决该问题呢?
力扣272。

答案2022-02-02:

【前驱节点-目标值】和【前驱节点-目标值】,越靠近target,就取这个节点。取了前驱节点,左扩;取了后驱节点,右扩。
准备两个栈,快速支持找前驱和后继。
时间复杂度:低于O(N)。
空间复杂度:低于O(N)。

代码用golang编写。代码如下:

package main

import "fmt"

func main() {
root := &TreeNode{val: 4}
root.left = &TreeNode{val: 2}
root.right = &TreeNode{val: 5}
root.left.left = &TreeNode{val: 1}
root.left.right = &TreeNode{val: 3}
ret := closestKValues(root, 3.713286, 2)
fmt.Println(ret)
} type TreeNode struct {
val int
left *TreeNode
right *TreeNode
} func NewTreeNode(val int) *TreeNode {
ans := &TreeNode{}
ans.val = val
return ans
} // 这个解法来自讨论区的回答,最优解实现的很易懂且漂亮
func closestKValues(root *TreeNode, target float64, k int) []int {
ret := make([]int, 0)
// >=8,最近的节点,而且需要快速找后继的这么一种结构
moreTops := make([]*TreeNode, 0)
// <=8,最近的节点,而且需要快速找前驱的这么一种结构
lessTops := make([]*TreeNode, 0)
getMoreTops(root, target, &moreTops)
getLessTops(root, target, &lessTops)
if len(moreTops) > 0 && len(lessTops) > 0 && moreTops[len(moreTops)-1].val == lessTops[len(lessTops)-1].val {
getPredecessor(&lessTops)
}
for k > 0 {
k--
if len(moreTops) == 0 {
ret = append(ret, getPredecessor(&lessTops))
} else if len(lessTops) == 0 {
ret = append(ret, getSuccessor(&moreTops))
} else {
diffs := abs(float64(moreTops[len(moreTops)-1].val) - target)
diffp := abs(float64(lessTops[len(lessTops)-1].val) - target)
if diffs < diffp {
ret = append(ret, getSuccessor(&moreTops))
} else {
ret = append(ret, getPredecessor(&lessTops))
}
}
}
return ret
} func abs(d float64) float64 {
if d < 0 {
return -d
} else {
return d
} } // 在root为头的树上
// 找到>=target,且最接近target的节点
// 并且找的过程中,只要某个节点x往左走了,就把x放入moreTops里
func getMoreTops(root *TreeNode, target float64, moreTops *[]*TreeNode) {
for root != nil {
if root.val == int(target) {
*moreTops = append(*moreTops, root)
break
} else if root.val > int(target) {
*moreTops = append(*moreTops, root)
root = root.left
} else {
root = root.right
}
}
} // 在root为头的树上
// 找到<=target,且最接近target的节点
// 并且找的过程中,只要某个节点x往右走了,就把x放入lessTops里
func getLessTops(root *TreeNode, target float64, lessTops *[]*TreeNode) {
for root != nil {
if root.val == int(target) {
*lessTops = append(*lessTops, root)
break
} else if root.val < int(target) {
*lessTops = append(*lessTops, root)
root = root.right
} else {
root = root.left
}
}
} // 返回moreTops的头部的值
// 并且调整moreTops : 为了以后能很快的找到返回节点的后继节点
func getSuccessor(moreTops *[]*TreeNode) int {
cur := (*moreTops)[len(*moreTops)-1]
*moreTops = (*moreTops)[0 : len(*moreTops)-1]
ret := cur.val
cur = cur.right
for cur != nil {
*moreTops = append(*moreTops, cur)
cur = cur.left
}
return ret
} // 返回lessTops的头部的值
// 并且调整lessTops : 为了以后能很快的找到返回节点的前驱节点
func getPredecessor(lessTops *[]*TreeNode) int {
cur := (*lessTops)[len(*lessTops)-1]
*lessTops = (*lessTops)[0 : len(*lessTops)-1]
ret := cur.val
cur = cur.left
for cur != nil {
*lessTops = append(*lessTops, cur)
cur = cur.right
}
return ret
}

执行结果如下:


左神java代码

2022-02-02:最接近的二叉搜索树值 II。 给定一个不为空的二叉搜索树和一个目标值 target,请在该二叉搜索树中找到最接近目标值 target 的 k 个值。 注意: 给定的目标值 ta的更多相关文章

  1. [leetcode]270. Closest Binary Search Tree Value二叉搜索树中找target的最接近值

    Given a non-empty binary search tree and a target value, find the value in the BST that is closest t ...

  2. 算法dfs——二叉搜索树中最接近的值 II

    901. 二叉搜索树中最接近的值 II 中文 English 给定一棵非空二叉搜索树以及一个target值,找到 BST 中最接近给定值的 k 个数. 样例 样例 1: 输入: {1} 0.00000 ...

  3. 270. Closest Binary Search Tree Value 二叉搜索树中,距离目标值最近的节点

    [抄题]: Given a non-empty binary search tree and a target value, find the value in the BST that is clo ...

  4. 面试题 02.02. [链表][双指针]返回倒数第 k 个节点

    面试题 02.02. 返回倒数第 k 个节点 方法一:使用外部空间 // 执行用时: 1 ms , 在所有 Java 提交中击败了 16.75% 的用户 // 内存消耗: 36.8 MB , 在所有 ...

  5. [LeetCode] Kth Smallest Element in a BST 二叉搜索树中的第K小的元素

    Given a binary search tree, write a function kthSmallest to find the kth smallest element in it. Not ...

  6. [LeetCode] 230. Kth Smallest Element in a BST 二叉搜索树中的第K小的元素

    Given a binary search tree, write a function kthSmallest to find the kth smallest element in it. Not ...

  7. LeetCode——230. 二叉搜索树中第K小的元素

    给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 个最小的元素. 说明: 你可以假设 k 总是有效的,1 ≤ k ≤ 二叉搜索树元素个数. 示例 1: 输入: root = ...

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

    230. 二叉搜索树中第K小的元素 题意 给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 个最小的元素. 你可以假设 k 总是有效的,1 ≤ k ≤ 二叉搜索树元素个数. ...

  9. leetcode 二叉搜索树中第K小的元素 python

          二叉搜索树中第K小的元素     给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 个最小的元素. 说明:你可以假设 k 总是有效的,1 ≤ k ≤ 二叉搜索树元 ...

  10. LeetCode:二叉搜索树中第K小的数【230】

    LeetCode:二叉搜索树中第K小的数[230] 题目描述 给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 个最小的元素. 说明:你可以假设 k 总是有效的,1 ≤ k ...

随机推荐

  1. 关于k8s微服务的基础知识分享总结

    1.说起k8s,先得讲讲微服务,来个图(百度上找到的图),初识 1.微服务架构强调的是一种架构模式,提倡将单一的应用程序,划分为一组小的服务,每个服务运行在其独立的自己的进程中,服务之间相互协调配合, ...

  2. MySQL学习(十)索引

    1.索引的种类 聚簇索引,非聚簇索引 主键索引,唯一索引,普通索引(前缀索引),全文索引 单值索引,复合索引 二级索引 覆盖索引 1.1 聚簇索引,非聚簇索引 参考文档: https://www.cn ...

  3. .NET Task 揭秘(3)async 与 AsyncMethodBuilder

    目录 前言 AsyncMethodBuilder 介绍 AsyncMethodBuilder 是状态机的重要组成部分 AsyncMethodBuilder 的结构 AsyncMethodBuilder ...

  4. Z 函数

    简单记一下,避免忘记. z 函数 对于字符串 \(S\),我们将 \(z(i)\) 定义为从 \(i\) 开始的后缀与 \(S\) 的最长公共前缀的长度. \(O(n)\) 求出 z 函数 我们添加一 ...

  5. 【单元测试】Junit 4(六)--junit4测试优先级顺序

    ​ @FixMethodOrder的顺序也并不一定是方法在代码中定义的顺序,这与JVM的实现有关. ​ 我们在写JUnit测试用例时,有时候需要按照定义顺序执行我们的单元测试方法,比如如在测试数据库相 ...

  6. Solr 入门配置

    大多数搜索引擎应用都必须具有某种搜索功能,问题是搜索功能往往是巨大的资源消耗,并且它们由于沉重的数据库加载而拖垮你的应用的性能.这就是为什么转移负载到一个外部的搜索服务器是一个不错的注意,Apache ...

  7. 开发轻量级REST API样板 基于Node.js、MongoDB 通过Mongoose驱动

    ZY.Node.Mongodb https://gitee.com/Z568_568/node.mongodb.git https://github.com/ZHYI-source/ZY.Node.M ...

  8. Mybatis的整体理解

    I有关于我的对ybatis的设想: 简单总结-下有关于我对wybat is的架构理解: 总体分为三个层面: 1.对外接口API 2.MapStatement数据处理 3.执行及其数据存储 两个主要的对 ...

  9. Windows注册表中修改UAC(用户账号控制)及批处理脚

    我在windows电脑上安装软件时,或者设置开机启动软件时,会先弹出提示框: 用户账户控制 你要允许此应用对你的设备进行更改吗? 很烦人,我不想每次都提醒.需要关闭"用户账户控制" ...

  10. [Linux]常用命令之【mount/umount】

    1 mount mount命令的作用是加载文件系统,它的用权限是超级用户或/etc/fstab中允许的使用者. 在Linux和Unix系统上,所有文件都是作为一个大型树(以/为根)的一部分访问的. 要 ...