📅  最后修改于: 2023-12-03 15:42:05.002000             🧑  作者: Mango
给定一个二叉搜索树,找到树中任意两个不同节点的值之间的差的绝对值最小值。
下面是使用Python实现的函数:
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
def getMinimumDifference(root: TreeNode) -> int:
prev = float('-inf')
minDiff = float('inf')
def inorderTraversal(node):
nonlocal prev, minDiff
if not node:
return
inorderTraversal(node.left)
minDiff = min(minDiff, node.val - prev)
prev = node.val
inorderTraversal(node.right)
inorderTraversal(root)
return minDiff
对于BST(二叉搜索树),我们可以使用中序遍历来得到一个有序数组,然后在有序数组中找到任意两个元素之间的差的绝对值最小值。因为二叉搜索树的中序遍历是有序的,所以两个有序元素之间的差的绝对值最小值只能是它们相邻的两个元素之间的差的绝对值。
因此,我们可以使用一个变量prev
来存储当前遍历的前一个节点的值,用来计算当前节点与前一个节点之间的差的绝对值。在遍历时,我们使用一个变量minDiff
来存储当前最小的差的绝对值,每当我们遍历到一个节点时,就将minDiff
更新为当前节点与前一个节点之间的差的绝对值和minDiff
本身的最小值。最后返回minDiff
即可。
下面是一些测试用例:
# 测试用例 1
root = TreeNode(1)
root.right = TreeNode(3)
root.right.left = TreeNode(2)
assert getMinimumDifference(root) == 1
# 测试用例 2
root = TreeNode(4)
root.left = TreeNode(2)
root.right = TreeNode(6)
root.left.left = TreeNode(1)
root.left.right = TreeNode(3)
root.right.left = TreeNode(5)
root.right.right = TreeNode(7)
assert getMinimumDifference(root) == 1
我们遍历了一次二叉搜索树,时间复杂度为$O(n)$。
我们使用了一个变量prev
来存储当前遍历的前一个节点的值,和一个变量minDiff
来存储当前最小的差的绝对值,空间复杂度为$O(1)$。