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

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

原文地址:https://www.cnblogs.com/bonelee/p/11632584.html

时间: 2024-10-29 14:57:21

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

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

题目链接 https://leetcode.com/problems/insert-into-a-binary-search-tree/description/ 题目描述 给定二叉搜索树(BST)的根节点和要插入树中的值,将值插入二叉搜索树. 返回插入后二叉搜索树的根节点. 保证原始二叉搜索树中不存在新值. 注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可. 你可以返回任意有效的结果. 例如, 给定二叉搜索树: 4 / 2 7 / 1 3 和 插入的值: 5 你可以返回这个

二叉搜索树中的常用方法

1 package Tree; 2 3 import org.junit.Test; 4 5 class TreeNode { 6 7 int val = 0; 8 TreeNode left = null; 9 TreeNode right = null; 10 11 public TreeNode(int val) { 12 this.val = val; 13 14 } 15 16 } 17 18 public class BinarySearchTree { 19 20 /** 21 *

[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. Return the root node reference (possibly updated) of the BST. Basically, the deletion can be divided into two stages: Search for a node to remove. If the n

[LeetCode] 285. Inorder Successor in BST 二叉搜索树中的中序后继节点

Given a binary search tree and a node in it, find the in-order successor of that node in the BST. Note: If the given node has no in-order successor in the tree, return null. 给一个二叉搜索树和它的一个节点,找出它的中序后继节点,如果没有返回null. 解法1: 用中序遍历二叉搜索树,当找到root.val = p.val的时

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

二叉搜索树中第K小的元素 给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 个最小的元素. 说明:你可以假设 k 总是有效的,1 ≤ k ≤ 二叉搜索树元素个数. 示例 1: 输入: root = [3,1,4,null,2], k = 1 3 / 1 4   2 输出: 1 示例 2: 输入: root = [5,3,6,2,4,null,null,1], k = 3 5 / 3 6 / 2 4 / 1 输出: 3 进阶:如果二叉搜索树经常被修改(插入/删除操作)并且

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

230. 二叉搜索树中第K小的元素 题意 给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 个最小的元素. 你可以假设 k 总是有效的,1 ≤ k ≤ 二叉搜索树元素个数. 解题思路 中序遍历,利用Python3中提供的生成器方法: 中序遍历,判断存储结点值的数组是否到到k,则表明访问的一个结点就是第k个最小的元素: 先获取跟结点处于的位置(第几个最小的元素),如果它比k小,则从右子结点中找,如果它比k大,则从左子节点中找: 实现 class Solution:    

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

给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 个最小的元素. 说明:你可以假设 k 总是有效的,1 ≤ k ≤ 二叉搜索树元素个数. 示例 1: 输入: root = [3,1,4,null,2], k = 1 3 / 1 4   2 输出: 1 示例 2: 输入: root = [5,3,6,2,4,null,null,1], k = 3 5 / 3 6 / 2 4 / 1 输出: 3 一个中序遍历的搜索,递归或者栈. /** * Definition for a

[Swift]LeetCode501. 二叉搜索树中的众数 | Find Mode in Binary Search Tree

Given a binary search tree (BST) with duplicates, find all the mode(s) (the most frequently occurred element) in the given BST. Assume a BST is defined as follows: The left subtree of a node contains only nodes with keys less than or equal to the nod

230 Kth Smallest Element in a BST 二叉搜索树中第K小的元素

给定一个二叉搜索树,编写一个函数kthSmallest来查找其中第k个最小的元素. 注意:你可以假设k总是有效的,1≤ k ≤二叉搜索树元素个数. 进阶:如果经常修改二叉搜索树(插入/删除操作)并且你需要频繁地找到第k小值呢? 你将如何优化kthSmallest函数? 详见:https://leetcode.com/problems/kth-smallest-element-in-a-bst/description/ 方法一:递归实现 /** * Definition for a binary