题目
给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 。
差值是一个正数,其数值等于两值之差的绝对值。
示例:
输入:root = [4,2,6,1,3]
输出:1
输入:root = [1,0,48,null,null,12,49]
输出:1
代码
class Solution:
def getMinimumDifference(self, root: Optional[TreeNode]) -> int:
minnumber=inf
def getmin(root):
nonlocal minnumber
if not root: #递归结束条件
return
left=root.left
right=root.right
if not left and not right: #没有左右子树,结束
return
if left: #找左子树的最大值
while left.right:
left=left.right
minnumber=min(minnumber,root.val-left.val)
getmin(root.left) #左子树递归
if right:#找右子树达到最小值
while right.left:
right=right.left
minnumber=min(minnumber,right.val-root.val)
getmin(root.right) #右子树递归
getmin(root)
return minnumber
代码思路:
因为二叉搜索树左节点<父节点<右节点的性质,最小绝对值差就是当前节点与左子树的最大值与右子树最小值的差
找每一个节点的左子树的最大值与右子树的最小值进行与当前节点相减,更新minnumber
代码逻辑:
节点为空返回,
有左节点,找左子树的最大值,递归左节点
有右节点,找右子树的最小值,递归右节点
时间复杂度O(n),空间复杂度O(1)
此题也可以利用二叉搜索树的中序遍历,计算递增序列每两个相邻节点的差值进行更新来查找
空间复杂度一般为O(logn)