zoukankan      html  css  js  c++  java
  • 算法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
    
  • 相关阅读:
    使用node.js和socket.io实现多人聊天室
    linux上如何自动获取ip及连接互联网
    大数据 时间同步问题 解决hbase集群节点HRegionServer启动后自动关闭
    大数据环境完全分布式搭建hbase-0.96.2-hadoop2
    大数据环境完全分布式搭建 hadoop2.4.1
    大数据环境完全分布式搭建linux(centos)中安装zookeeper
    虚拟机中操作系统的克隆方法及ip修改及硬件地址修改
    在Windows系统下安装Beautiful Soup4的步骤和方法
    在eclipse中配置Python环境
    python3.4爬取网页的乱码问题
  • 原文地址:https://www.cnblogs.com/bonelee/p/11632584.html
Copyright © 2011-2022 走看看