思路:
1.中序遍历二叉搜索树得到的为一个有序数组,可利用此特性求Minimum Absolute Difference。
2.一个有数数组两两之间数值间隔最小,所以只需比较两两之间的差值大小。
递归法:
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def getMinimumDifference(self, root: Optional[TreeNode]) -> int:
sorted_list = []
def traversal(root: TreeNode) -> int:
if not root:
return
nonlocal sorted_list
traversal(root.left)
sorted_list.append(root.val)
traversal(root.right)
def __getMinAbslDiff(ls: list) -> int:
res = float("inf")
for i in range(1,len(ls)):
temp = ls[i] - ls[i-1]
if temp < res:
res = temp
return res
traversal(root)
return __getMinAbslDiff(sorted_list)
递归法(边中序遍历边计算):
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def getMinimumDifference(self, root: Optional[TreeNode]) -> int:
pre = None
res = float('INF')
def traversal(root: TreeNode) -> int:
if not root:
return
nonlocal pre, res
traversal(root.left)
# 注意:在递归中如何记录前一个节点的指针 写法如下
if pre != None: #这一步,有序数组第一个元素,i.e.最底层最左边叶子节点A是不会执行
#的,但会被之后的所有节点执行
temp = root.val - pre.val
if temp < res:
res = temp
pre = root #从这一步开始,A被pre所指
traversal(root.right)
return res
return traversal(root)