901. 二叉搜索树中最接近的值 II

中文
English

给定一棵非空二叉搜索树以及一个target值,找到 BST 中最接近给定值的 k 个数。

样例

样例 1:

输入:
{1}
0.000000
1
输出:
[1]
解释:
二叉树 {1},表示如下的树结构:
1

样例 2:

输入:
{3,1,4,#,2}
0.275000
2
输出:
[1,2]
解释:
二叉树 {3,1,4,#,2},表示如下的树结构:
3
/ \
1 4
\
2

挑战

假设是一棵平衡二叉搜索树,你可以用时间复杂度低于O(n)的算法解决问题吗( n 为节点个数)?

注意事项

  • 给出的target值为浮点数
  • 你可以假设 k 总是合理的,即 k ≤ 总节点数
  • 我们可以保证给出的 BST 中只有唯一一个最接近给定值的 k 个值的集合
"""
Definition of TreeNode:
class TreeNode:
def __init__(self, val):
self.val = val
self.left, self.right = None, None
""" class Solution:
"""
@param root: the given BST
@param target: the given target
@param k: the given k
@return: k values in the BST that are closest to the target
"""
def closestKValues(self, root, target, k):
if root is None or k == 0:
return [] nums = self.get_inorder(root)
left = self.find_lower_index(nums, target)
right = left + 1
results = []
for _ in range(k):
if (right >= len(nums)) or (left >=0 and target - nums[left] < nums[right] - target):
results.append(nums[left])
left -= 1
else:
results.append(nums[right])
right += 1
return results def get_inorder(self, root):
result = []
stack = []
node = root
while stack or node:
if node:
stack.append(node)
node = node.left
else:
node = stack.pop()
result.append(node.val)
node = node.right
return result def find_lower_index(self, nums, target):
"""
find the largest number < target, return the index
"""
start, end = 0, len(nums) - 1
while start + 1 < end:
mid = (start + end) // 2
if nums[mid] < target:
start = mid
else:
end = mid if nums[end] < target:
return end if nums[start] < target:
return start return -1

更优的解法,todo

相关的题目:

11. 二叉查找树中搜索区间

中文
English

给定一个二叉查找树和范围[k1, k2]。按照升序返回给定范围内的节点值。

样例

样例 1:

输入:{5},6,10
输出:[]
5
它将被序列化为 {5}
没有数字介于6和10之间

样例 2:

输入:{20,8,22,4,12},10,22
输出:[12,20,22]
解释:
20
/ \
8 22
/ \
4 12
它将被序列化为 {20,8,22,4,12}
[12,20,22]介于10和22之间
"""
Definition of TreeNode:
class TreeNode:
def __init__(self, val):
self.val = val
self.left, self.right = None, None
""" class Solution:
"""
@param root: param root: The root of the binary search tree
@param k1: An integer
@param k2: An integer
@return: return: Return all keys that k1<=key<=k2 in ascending order
"""
def searchRange(self, root, k1, k2):
# write your code here
"""
# recursive solution
if not root:
return []
if root.val < k1:
return self.searchRange(root.right, k1, k2)
elif root.val > k2:
return self.searchRange(root.left, k1, k2)
else:
return self.searchRange(root.left, k1, k2) + [root.val] + \
self.searchRange(root.right, k1, k2)
""" result = []
q = [root] while q:
node = q.pop()
if not node:
continue if k1 <= node.val <= k2:
result.append(node.val)
q.append(node.left)
q.append(node.right)
elif node.val < k1:
q.append(node.right)
else:
q.append(node.left) result.sort()
return result

85. 在二叉查找树中插入节点

中文
English

给定一棵二叉查找树和一个新的树节点,将节点插入到树中。

你需要保证该树仍然是一棵二叉查找树。

样例

样例  1:
输入: tree = {}, node= 1
输出: {1} 样例解释:
在空树中插入一个点,应该插入为根节点。 样例 2:
输入: tree = {2,1,4,3}, node = 6
输出: {2,1,4,3,6} 样例解释:
如下: 2 2
/ \ / \
1 4 --> 1 4
/ / \
3 3 6

挑战

能否不使用递归?

注意事项

保证不会出现重复的值

"""
Definition of TreeNode:
class TreeNode:
def __init__(self, val):
self.val = val
self.left, self.right = None, None
""" class Solution:
"""
@param: root: The root of the binary search tree.
@param: node: insert this node into the binary search tree
@return: The root of the new binary search tree.
"""
def insertNode(self, root, target):
# write your code here
if not root:
return target node = root
while node:
if target.val > node.val:
if node.right is None:
node.right = target
return root
node = node.right
elif target.val < node.val:
if node.left is None:
node.left = target
return root
node = node.left
return root

另外递归的解法也很优雅:

"""
在树上定位要插入节点的位置。 如果它大于当前根节点,则应该在右子树中,
如果它小于当前根节点,则应该在左子树中。
(二叉查找树中保证不插入已经存在的值)
"""
class Solution:
"""
@param: root: The root of the binary search tree.
@param: node: insert this node into the binary search tree
@return: The root of the new binary search tree.
"""
def insertNode(self, root, node):
# write your code here
return self.__helper(root, node) # helper函数定义成私有属性
def __helper(self, root, node):
if root is None:
return node
if node.val < root.val:
root.left = self.__helper(root.left, node)
else:
root.right = self.__helper(root.right, node)
return root

算法dfs——二叉搜索树中最接近的值 II的更多相关文章

  1. LeetCode701 二叉搜索树中插入结点

    给定二叉搜索树(BST)的根节点和要插入树中的值,将值插入二叉搜索树. 返回插入后二叉搜索树的根节点. 保证原始二叉搜索树中不存在新值. 注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜 ...

  2. [Swift]LeetCode701. 二叉搜索树中的插入操作 | Insert into a Binary Search Tree

    Given the root node of a binary search tree (BST) and a value to be inserted into the tree, insert t ...

  3. Leetcode 701. 二叉搜索树中的插入操作

    题目链接 https://leetcode.com/problems/insert-into-a-binary-search-tree/description/ 题目描述 给定二叉搜索树(BST)的根 ...

  4. Java实现 LeetCode 701 二叉搜索树中的插入操作(遍历树)

    701. 二叉搜索树中的插入操作 给定二叉搜索树(BST)的根节点和要插入树中的值,将值插入二叉搜索树. 返回插入后二叉搜索树的根节点. 保证原始二叉搜索树中不存在新值. 注意,可能存在多种有效的插入 ...

  5. [Swift]LeetCode450. 删除二叉搜索树中的节点 | Delete Node in a BST

    Given a root node reference of a BST and a key, delete the node with the given key in the BST. Retur ...

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

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

  7. Java实现 LeetCode 450 删除二叉搜索树中的节点

    450. 删除二叉搜索树中的节点 给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变.返回二叉搜索树(有可能被更新)的根节点的引 ...

  8. [LeetCode]230. 二叉搜索树中第K小的元素(BST)(中序遍历)、530. 二叉搜索树的最小绝对差(BST)(中序遍历)

    题目230. 二叉搜索树中第K小的元素 给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 个最小的元素. 题解 中序遍历BST,得到有序序列,返回有序序列的k-1号元素. 代 ...

  9. 刷题-力扣-230. 二叉搜索树中第K小的元素

    230. 二叉搜索树中第K小的元素 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/kth-smallest-element-in-a ...

随机推荐

  1. 透彻的掌握 Spring 中@transactional 的使用

    事务管理是应用系统开发中必不可少的一部分.Spring 为事务管理提供了丰富的功能支持.Spring 事务管理分为编码式和声明式的两种方式.编程式事务指的是通过编码方式实现事务:声明式事务基于 AOP ...

  2. 整合zuul启动时报错Correct the classpath of your application so that it contains a single, compatible version of XXX

    今天集成zuul与consul的时候,出现如下错误 ***************************APPLICATION FAILED TO START******************** ...

  3. 接口性能指标TP90

    TP90,即,Top percentile 90, 前90%的意思. 这是一个常用于网站性能监控的指标.tp90是一个时间值,例如tp90=3ms,其含义是90%的请求,在3ms之内,可以得到响应. ...

  4. POJ-动态规划-典型问题模板

    动态规划典型问题模板 一.最长上升子序列(Longest increasing subsequence) 状态(最关键):f[N]为动规数组,f[i]表示从第一个字符开始,以a[i]为最后一个字符的序 ...

  5. 小白的C++之路——求质数

    初学C++,打算用博客记录学习的足迹.写了两个求质数的程序,修修改改. #include <iostream> #include <math.h> using namespac ...

  6. C#怎么判断字符是不是汉字 汉字和Unicode编码互相转换

    判断一个字符是不是汉字通常有三种方法,第1种用 ASCII 码判断(在 ASCII码表中,英文的范围是0-127,而汉字则是大于127,根据这个范围可以判断),第2种用汉字的 UNICODE 编码范围 ...

  7. 【数据库】Mysql配置参数

    vim /ect/my.cnf 使用命令打开mysql的配置文件. 加入以下参数 [mysql] default-character-set=utf8 [mysqld] lower_case_tabl ...

  8. 掌握算法&数据结构的正确方式

  9. java 枚举示例

    public enum YNEnum { N(0,"否"), Y(1,"是"); private int code; private String name; ...

  10. jsp代码中实现下拉选项框的回显代码

    用到了c标签库:首先要在jsp中导入jstl的核心库标签 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/js ...