E-NR270. Closest Binary Search Tree Value

float('inf')

float('inf')=float('+inf')正无穷

float('-inf')负无穷

思考:写到这里, 发现每个树的递归都能至少用四种方法写(分别回囘囬廻):

即用

  • 带helper与否

  • if root 输出或者 if not root输出.

# 1 不要helper, 直接拿全局变量操作
class Solution:
    def __init__(self):
        self.diff = float('inf')
        self.node = None
        
    def closestValue(self, root: TreeNode, target: float) -> int:
        if not root:
            return None
        
        self.closestValue(root.left, target)
        
        cur_diff = self.diff
        self.diff = min(self.diff, abs(target-root.val))
        if cur_diff == self.diff:
            return self.node.val
        else:
            self.node = root
            
        self.closestValue(root.right, target)
        return self.node.val

# or 1(if root版本):
class Solution:
    def __init__(self):
        self.diff = float('inf')
        self.node = None
        
    def closestValue(self, root: TreeNode, target: float) -> int:
        if root:
            self.closestValue(root.left, target)
            
            cur_diff = self.diff
            self.diff = min(self.diff, abs(target-root.val))
            if cur_diff == self.diff:
                return self.node.val
            else:
                self.node = root
                
            self.closestValue(root.right, target)
            return self.node.val
        else:
            return None
            
# 2 带helper的:
class Solution:
    def closestValue(self, root: TreeNode, target: float) -> int:
        def find_closest(root, closest_node, min_diff):
            if not root:
                return closest_node, min_diff 
            
            closest_node, min_diff = find_closest(root.left, closest_node, min_diff)
            
            cur_diff = min_diff
            min_diff = min(abs(target-root.val), cur_diff)
            if min_diff == cur_diff:
                return closest_node, min_diff
            else:
                closest_node = root
            
            closest_node, min_diff = find_closest(root.right, closest_node, min_diff)
            return closest_node, min_diff
        
        a, b = find_closest(root, None, float('inf'))
        
        return a.val

# 2 同理有个if root版本, 不赘述了

# 别人的一些答案, 学习一下:
class Solution:
    def closestValue(self, root: TreeNode, target: float) -> int:
        cur = float('-inf')
        return self.inorder(root, target, cur)
    def inorder(self, root, target, cur):
        if root is None: 
            return cur
        cur = self.inorder(root.left, target, cur)
        if abs(cur-target) > abs(root.val - target):
            cur = root.val
        else:
            return cur
        return self.inorder(root.right, target, cur)
            
class Solution:
    def closestValue(self, root: TreeNode, target: float) -> int:
        closest = None
        minVal = float('inf')
        while root:
            if minVal > abs(root.val - target):
                minVal = abs(root.val - target)
                closest = root.val
            if root.val >= target:
                root = root.left
            elif root.val < target:
                root = root.right
        return closest
        
class Solution:
    def closestValue(self, root, target):
        self.closest = float('inf')
        
        def helper(root, value):
            if not root:
                return
            if abs(root.val - target) < abs(self.closest - target):
                self.closest = root.val
                
            # Target should be located on left subtree
            if target < root.val:
                helper(root.left, target)
                
            # target should be located on right subtree
            if target > root.val:
                helper(root.right, target)
        
        helper(root, target)
        return self.closest

Last updated

Was this helpful?