给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值。
示例:
提示:树中至少有 2 个节点。
思路:
(暴力方法)因为二叉搜索树的元素是有序的,可以把元素放入一个list,然后计算list中相邻两元素的差值,找到最小的差值。
暴力法:
class Solution:
def __init__(self):
self.vec = [] # 初始化一个空列表用于存储节点值
def traversal(self, root):
if root is None: # 如果当前节点为空,直接返回
return
self.traversal(root.left) # 递归遍历左子树
self.vec.append(root.val) # 将当前节点值加入列表,构建有序数组
self.traversal(root.right) # 递归遍历右子树
def getMinimumDifference(self, root):
self.vec = [] # 清空列表
self.traversal(root) # 中序遍历二叉搜索树,填充列表
if len(self.vec) < 2: # 如果节点数少于2,返回0
return 0
result = float('inf') # 初始化最小差值为正无穷大
for i in range(1, len(self.vec)):
# 计算相邻节点值之间的差,并更新最小差值
result = min(result, self.vec[i] - self.vec[i - 1])
return result # 返回最小差值
这个Python类Solution
的功能是找到二叉搜索树中任意两节点值之间的最小差值。下面是对每一部分的解释:
-
__init__
方法:- 初始化一个空列表
self.vec
用于存储二叉搜索树的节点值。
- 初始化一个空列表
-
traversal
方法:root
:当前遍历的节点。- 如果
root
为空,直接返回,终止递归。 - 递归遍历左子树,即
self.traversal(root.left)
。 - 将当前节点的值加入列表
self.vec
,构建有序数组。 - 递归遍历右子树,即
self.traversal(root.right)
。
-
getMinimumDifference
方法:- 接受二叉搜索树的根节点
root
作为参数。 - 清空列表
self.vec
。 - 调用
traversal
方法,从根节点开始中序遍历整个树,填充列表self.vec
。 - 如果列表中节点数少于2个,返回0。
- 初始化最小差值
result
为正无穷大。 - 遍历有序数组
self.vec
,计算相邻节点值之间的差,并更新最小差值result
。 - 返回
result
,即找到的最小差值。
- 接受二叉搜索树的根节点
---------------------------------------------------------------------------------------------------------------------------------
(更好的方法)中序遍历,双指针,直接得出最小绝对差。
两个指针:pre,cur
终止条件:遇到None,就return
单层递归:遍历左子树(cur.left)
如果self.pre不是None,把result更新为result和cur.val-self.pre.val的较小的值。然后让self.pre=cur
遍历右子树(cur.right)
双指针法:
class Solution:
def __init__(self):
self.result = float('inf') # 初始化最小值为正无穷
self.pre = None # 初始化前一个节点为None
def traversal(self, cur):
if cur is None: # 如果当前节点为空,直接返回
return
self.traversal(cur.left) # 递归遍历左子树
if self.pre is not None: # 如果前一个节点不为空
self.result = min(self.result, cur.val - self.pre.val) # 更新最小差值
self.pre = cur # 更新前一个节点为当前节点
self.traversal(cur.right) # 递归遍历右子树
def getMinimumDifference(self, root):
self.traversal(root) # 从根节点开始遍历
return self.result # 返回最小差值
这个Python类Solution
的功能是找到二叉搜索树中任意两节点值之间的最小差值。下面是对每一部分的解释:
-
__init__
方法:- 初始化两个属性:
self.result
:记录当前找到的最小差值,初始值设为正无穷大。self.pre
:记录中序遍历过程中前一个节点,初始值为None
。
- 初始化两个属性:
-
traversal
方法:cur
:当前遍历的节点。- 如果
cur
为空,直接返回,终止递归。 - 递归遍历左子树,即
self.traversal(cur.left)
。 - 如果
self.pre
不为空,计算当前节点值与前一个节点值的差,并更新最小差值self.result
。 - 更新
self.pre
为当前节点cur
。 - 递归遍历右子树,即
self.traversal(cur.right)
。
-
getMinimumDifference
方法:- 接受二叉搜索树的根节点
root
作为参数。 - 调用
traversal
方法,从根节点开始中序遍历整个树。 - 返回
self.result
,即找到的最小差值。
- 接受二叉搜索树的根节点